如何创建动态返回模型

问题描述 投票:0回答:1

我想为存储过程创建一个库。我有一个继承自StorageFactoryAbstractStorageFactory。但是我的配置类型根据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");
        }
    }
}
c#
1个回答
0
投票

也许是这样的?我试图模仿你的课程(工厂,战略和配置)。但是我仍然会以不同的方式做到:)

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" });
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.