2

MVC Application内でホストされているWCF Serviceがあります。サービスは、いくつかのリポジトリ (私は Code First 設計) とやり取りして、その仕事を行います。現在、各 Service メソッド内にすべての Repository クラスのインスタンスを作成していますが、それは悪いことだと思います。私の Service は完全に Repository クラスに結合されています。WCF サービスに適切でクリーンな DI を実装する方法を知りたいです。

前もって感謝します。

4

2 に答える 2

2

利用できるアプローチの 1 つは、サービス クラスにリポジトリ ファクトリを挿入し、ファクトリからリポジトリを呼び出す/取得することです。

リポジトリ ファクトリ:

public interface IRepositoryFactory
{
    IRepositoryOne GetRepositoryOne();
    IRepositoryTwo GetRepositoryTwo();
}

public class RepositoryFactory: IRepositoryFactory
{
    public DataAccess.RepositoryInterfaces.IRepositoryOne GetRepositoryOne()
    {
        return new RepositoryOne();
    }
    public DataAccess.RepositoryInterfaces.IRepositoryTwo GetRepositoryTwo()
    {
        return new RepositoryTwo();
    }
}

サービス クラス:

public ServiceClass: IService
{

    private readonly IRepositoryFactory _repositoryFactory;

    public ServiceClass(IRepositoryFactory factory)
    {
        _repositoryFactory = factory;
    }

    public IList<YourItems> GetYourItems()
    {
        var repository = _repositoryFactory.GetRepositoryOne();
        return repository.GetItems(....);
    }
}

このアプローチでは、個々のリポジトリすべてではなく、リポジトリ ファクトリのみを登録して解決する必要があります。これは一種のハイブリッドなアプローチですが、非常にクリーンで理解しやすいと思います。もちろん、常にファクトリを使用して、すべての呼び出しでリポジトリを解決できるわけではありません。もしよろしければ、そのサンプルもお見せします。

于 2013-01-08T19:35:51.117 に答える
2

依存性逆転の原則を使用することをお勧めします。リポジトリに特定のインターフェイスを実装させ、サービス クラスにそのインターフェイス (またはインターフェイス) のオブジェクト (またはオブジェクト) を取り込ませます。具象クラスを直接参照しないでください。次に、サービス クラスで行う必要があるのは、インターフェイスによって公開されているメソッドを呼び出して、必要な情報の一部またはすべてを表示することだけです。

そうすることで、コードが互いに分離されます。どちらも抽象化に依存しているためです。それでも、要求している素晴らしい機能を得ることができます。

これを行う方法は次のとおりです。WCFサービス クラスが、IRepositoryA を実装する RepositoryA を必要としているとします。あなたがすることはprivate、タイプ IRepositoryA のフィールド (通常は ) を持つことです。次に、タイプ IRepositoryA のオブジェクトを受け取るサービスでコンストラクターを作成し、渡されるそのオブジェクトでフィールド変数を設定します。このサイトで見つかったもののようなもの:

依存性逆転の原則の詳細については、ボブおじさんの意見を読んでください。

于 2013-01-08T19:19:55.507 に答える