古いバージョンと新しいバージョンの両方を並行して動作させる必要があるアプリケーションを構築しています (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>();
}
}
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」をインスタンス化する必要があります。それ以外の場合は「old flow」インスタンス