我想为存储过程创建一个库。我有一个继承自StorageFactory
的AbstractStorageFactory
。但是我的配置类型根据ProviderType
而改变。因此,我想使用动态但我得到这个错误“考虑在StorageFactory
构造函数中转换动态参数”。
internal abstract class AbstractStorageFactory
{
public dynamic _configuration { get; set; }
protected AbstractStorageFactory(dynamic configuration) => _configuration = configuration;
}
internal class StorageFactory: AbstractStorageFactory
{
private static readonly dynamic configuration;
public StorageFactory() : base(configuration) { }
public ProviderType StorageProvider { get; set; }
public override StorageStrategy GetStorageStrategy(ProviderType provider)
{
switch (provider)
{
case ProviderType.AzureStorage:
var azureConfig = new AzureStorageConfiguration()
{
AccountName = configuration.AccountName,
BlobServiceEndpoint = configuration.BlobServiceEndpoint,
Key = configuration.Key,
ContainerName = configuration.ContainerName
};
return new AzureStorageStrategy(azureConfig);
case ProviderType.FTPStorage:
var ftpConfig = new FTPConfiguration()
{
Uri = configuration.Uri,
Username = configuration.Username,
Password = configuration.Password,
Port = configuration.Port,
EncryptionMode = configuration.EncryptionMode
};
return new FTPStrategy(ftpConfig);
default: throw new Exception("Unexpected internal error occured");
}
}
}
也许是这样的?我试图模仿你的课程(工厂,战略和配置)。但是我仍然会以不同的方式做到:)
public abstract class ConfigBase { }
public class FtpConfig : ConfigBase
{
public string Uri { get; set; }
}
public class AzureConfig : ConfigBase
{
public string AccountName { get; set; }
}
public abstract class StorageStrategyBase { }
public abstract class StorageStragegyBase<T> : StorageStrategyBase where T: ConfigBase
{
public abstract void Init(T config);
}
public class FtpStrategy : StorageStragegyBase<FtpConfig>
{
public override void Init(FtpConfig config)
{
var myUri = config.Uri;
}
}
public static class StrategyFactory
{
public static TStrategy GetStrategy<TStrategy,TConfig>(TConfig config) where TStrategy : StorageStragegyBase<TConfig>, new() where TConfig : ConfigBase
{
var s = new TStrategy();
s.Init(config);
return s;
}
}
class Program
{
static void Main(string[] args)
{
var myFtpStrategy = StrategyFactory.GetStrategy<FtpStrategy, FtpConfig>(new FtpConfig { Uri = "my url" });
}
}