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



我们正在构建一个应用程序,在这个应用程序中,我们必须同时使用旧版本和新版本(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>();
}
}

由于服务工厂是反模式的,而且它在将来退役旧流时会产生很多复杂性,所以我希望有一种方法来初始化容器(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",否则应实例化"old flow"实例

为什么不直接注入所需的依赖项?

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

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

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就不够了吗?

相关内容

  • 没有找到相关文章

最新更新