0

私は以下を持っています;

interface IRepository
--interface IRepositoryEF: IRepository
--interface IRepositoryNH: IRepository
----interface ICategoryRepositoryEF: IRepositoryEF
----interface ICategoryRepositoryNH: IRepositoryNH 

CategoryRepositoryEFサービスでCategoryRepositoryNHクラスを使いたい。それらをCategoryServiceに挿入するにはどうすればよいですか?

CategoryService(IRepository repository)
{

}

これに関するベストプラクティスは何ですか? を使用しRepositoryFactoryてサービスに挿入し、サービスにリポジトリを作成できますか?

次のようなことを意味します。

CategoryService(CategoryRepositoryFactory factory)
{
    var CategoryRepositoryEF = factory.Create("EF");
    var CategoryRepositoryNH = factory.Create("NH");
}

これは良い考えですか?それとも私は完全に間違っていますか?

4

2 に答える 2

2

アイデアは少しずれています。

リポジトリ インターフェイスの目的は、データ ソースを抽象化することです。目標は、すべての使用クラスが、データの出所を知らなくても情報を取得できるようにすることです。しかし、あなたのケースでは、NHibernate または EntityFramework が使用されているかどうかをクラスに認識させます。なんで?

IRepository特定のインターフェイスを作成するため、インターフェイスもありません。

ここでの質問は、むしろ「nhibernate またはエンティティ フレームワーク リポジトリをインターフェイスの 1 つにマップするにはどうすればよいか」です。

これは、アプリケーションの起動時に行う必要があります。通常、次のようなことを行います。

container.Register<ICategoryRepostitory, NHCategoryRepository>();
container.Register<IUserRepostitory, EFUserRepository>();

そうしないと、使用するコードを特定の実装と効果的に結合したことになります。その場合、インターフェイスはまったく必要ありません。

アップデート

like を注入すると、どのリポジトリが使用されますCategoryService(ICategoryRepository repository)か?

制御コンテナーの反転に登録したリポジトリー。要点は、両方の実装を登録するのではなく、すべてのリポジトリに対して 1 つのみを登録する必要があるということです。

簡単な例を以下に示します。

まず、web.config でリポジトリ タイプを管理します。

<configuration>
  <appSettings>
    <add key="RepositoryType" value="NHibernate" />
  </appSettings>
</configuration>

そして、コントロール コンテナーの反転を構成するときにこれを行います。

if (ConfigurationManager.AppSettings["RepositoryType"] == "NHibernate"))
{
    _autofac.RegisterType<NHCategoryRepository>.As<ICategoryRepository>();
    _autofac.RegisterType<NHUserRepository>.As<IUserRepository>();
}
else
{
    _autofac.RegisterType<EFCategoryRepository>.As<ICategoryRepository>();
    _autofac.RegisterType<EFUserRepository>.As<IUserRepository>();
}
于 2013-08-28T12:03:08.083 に答える
1

依存性インジェクターをNinjectとして使用し、コンストラクターを介してパラメーターを注入することができます

あなたのNinjectModule

public class NinjectModule : NinjectModule
{
    public override void Load() 
    {
        this.Bind<ICategoryRepositoryEF>().To<CategoryRepositoryEF>();
        this.Bind<ICategoryRepositoryNH >().To<CategoryRepositoryNH>();
        this.Bind<ICategoryService >().To<CategoryService>();
    }
}

依存関係を注入する

var kernel = new StandardKernel(new NinjectModule());
var categoryService = kernel.Get<ICategoryService>();   

これは単なる例ですが、アプリケーションのコンポジション ルート (エントリ ポイント) に依存関係を注入する必要があることを考慮してください。

于 2013-08-28T11:59:50.330 に答える