处理两个不同的应用程序流

时间:2018-11-21 14:05:12

标签: c# dependency-injection service-factory

我们正在构建一个应用程序,其中必须同时具有旧版本和新版本(V1是旧版本,V2是新版本)。现在,为了处理新流程,我们使用相同的旧接口,并且所有功能都相同并且仅在功能上有所不同,因此,我们现在必须定义一个命名实例,以便为新流程解析实例。

在流程中,团队已开始使用Service Factory Pattern,如下所示

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>();
    }
}

由于Service Factory是反模式的,并且在将来退出旧流程时也会造成很多复杂性,因此我想一种方法来初始化容器(structuremap 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流,则应实例化“ newflow”,否则应实例化“旧流”实例

1 个答案:

答案 0 :(得分:0)

为什么不插入所需的依赖项?

public class DataProcessor
{
    private readonly IDataManager _dataManager;

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

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

在您的enter image description here中,您可以有条件地将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够了吗?