【问题标题】:Handling two different application flows处理两个不同的应用程序流
【发布时间】:2019-04-24 03:03:48
【问题描述】:

我们正在构建一个应用程序,我们必须同时拥有新旧版本才能同时工作(V1 是旧版本,V2 是新版本)。现在为了处理新流,我们使用相同的旧接口,一切都相同,只是功能不同,因此现在我们必须定义一个命名实例,以便为新流解析实例。

在这个过程中,团队已经开始使用如下所示的服务工厂模式

class DataProcessor
{
    private readonly IDataManager _dataManager;

    public DataProcessor(IServiceFactory serviceFactory)
    {
        _dataManager = serviceFactory.GetInstance<IDataManager>();
    }

    public void Execute()
    {
        _dataManager.Run();
    }
}

服务工厂类

public class ServiceFactory : IServiceFactory
{
    private readonly IFeatureEvaluator _featureEvaluator;

    public ServiceFactory(IFeatureEvaluator featureEvaluator)
    {
        _featureEvaluator = featureEvaluator;
    }

    public T GetInstance<T>()
    {
        if (_featureEvaluator.IsEnabled<"V2">())
        {
            return ObjectFactory.GetInstance<T>("V2")
        }
        return  ObjectFactory.GetInstance<T>();
    }
}

由于服务工厂是反模式的,而且它在将来淘汰旧流程时会产生很多复杂性,我想要一种方法来初始化容器(结构映射 ioc)本身的依赖关系或在“纯 DI “这样我们就可以避免头痛。关于如何解决这个问题的任何想法。

更新: IDataManager 实现

public interface IDataManager
{
    void Run();
}

public class OldFlow : IDataManager
{
    public void Run()
    {
        //
    }
}

public class NewFlow : IDataManager
{
    public void Run()
    {
        //
    }
}

IDataManager 有 2 个实现,解析实例应该基于 _featureEvaluator,如果是 V2 流,则应该实例化“新流”,否则实例化“旧流”实例

【问题讨论】:

    标签: c# dependency-injection service-factory


    【解决方案1】:

    你为什么不直接注入你需要的依赖呢?

    public class DataProcessor
    {
        private readonly IDataManager _dataManager;
    
        public DataProcessor(IDataManager dataManager)
        {
            _dataManager = dataManager;
        }
    
        public void Execute()
        {
            _dataManager.Run();
        }
    }
    

    在您的Composition Root 中,您可以有条件地编写DataProcessor,并实现您想要的IDataManager

    public DataProcessor CreateDataProcessor()
    {
        if (_featureEvaluator.IsEnabled<"V2">())
        {
            IDataManager dm = new NewFlow();
            return new DataProcessor(dm);
        }
    
        IDataManager dm = new OldFlow();
        return new DataProcessor(dm);
    }
    

    这似乎类似于功能切换。顺便说一句,为什么_featureEvaluator 是一个接口? bool 不够吗?

    【讨论】:

    • IDataManager 有 2 个实现,是的 _featureEvaluator 被组合成一个接口以使 DI 兼容,是的,我们正在使用功能切换。
    猜你喜欢
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 2015-08-12
    • 2021-10-04
    • 1970-01-01
    相关资源
    最近更新 更多