2017-07-17 4 views
0

サービスロケータの使用を避けようとしています。前のコードは次のようになります。ServiceLocatorの使用を避ける

public class UnitOfWork 
{ 
    private T CreateRepository<T>(T repo) 
     where T : 
     IRepository 
    { 
     return ServiceLocator.Current.GetInstance<T>(); 
    } 
} 

私はIoCとしてAutofacを使用しています。私はドンt wanna use ILifetimeScope or IContainer`または類似。 Service Locatorを使用せずにIoC依存関係を導入することなく、リポジトリを作成する一般的な方法を作成する上品な方法で実装する方法に関するアイデアを共有できますか?

答えて

1

あなたがService Locator anti-patternを適用しているかどうかは、このコードはlocatedある場所によって異なり、理由: - それは、インフラストラクチャコンポーネントのComposition Rootにカプセル化

DIコンテナはサービスロケータではありません。言い換えれば

あなたUnitOfWork内部構成のルートを配置する場合には、あなたがサービスロケータアンチパターンとあなたのコードを適用していないことは結構です。

もちろん、アプリケーションコードでCreateRepositoryを呼び出すことはできません。なぜなら、Composition Root depends on all other codeはソリューション内にあり、何もComposition Rootに依存しないためです。

この問題は、このクラスからインターフェイスを抽出し、このインターフェイスを使用が必要なレイヤに配置することで簡単に解決できます。例えば:

// Core layer 
public interface IUnitOfWork 
{ 
    T CreateRepository<T>() where T : IRepository; 
} 

// Composition Root 
public class UnitOfWork : IUnitOfWork 
{ 
    // ... 
} 
関連する問題