2

我们正在构建一个应用程序,我们必须同时拥有旧版本和新版本(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 流,则应实例化“新流”,否则应实例化“旧流”实例

4

1 回答 1

0

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

public class DataProcessor
{
    private readonly IDataManager _dataManager;

    public DataProcessor(IDataManager dataManager)
    {
        _dataManager = dataManager;
    }

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

在您的组合根中,您可以有条件地组合您想要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不够吗?

于 2018-11-21T14:33:50.090 回答