我们正在构建一个应用程序,其中必须同时具有旧版本和新版本(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”,否则应实例化“旧流”实例
答案 0 :(得分: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
够了吗?