我们正在构建一个应用程序,其中必须同时具有旧版本和新版本才能同时工作(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)或以“ Pure 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”,否则应实例化“旧流”实例

最佳答案

您为什么不只注入所需的依赖项?

public class DataProcessor
{
    private readonly IDataManager _dataManager;

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

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


在您的Composition Root中,您可以根据需要将DataProcessorIDataManager的实现组合在一起:

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是否足够?

10-08 12:45