5

私は汎用インターフェースIRepository<T>と2つの実装xrmRepository<T>を持っていますefRepository<T>

に基づいてバインディングを変更したいT、より具体的には が から派生しxrmRepositoryたときに使用します。どうすればそれを達成できますか?TEntity

私は現在持っています:

kernel.Bind(typeof(IRepository<>)).To(typeof(efRepository<>)).InRequestScope();
kernel.Bind(typeof(IRepository<>)).To(typeof(xrmRepository<>)).When(request => request.Service.GetGenericArguments()[0].GetType().IsSubclassOf(typeof(Entity))).InRequestScope();

しかしIRepository<Contact>、Contact が Entity を継承していても、解決しようとすると efRepository になります。

名前付きバインディングを使用したくない場合は、どこにでも名前を追加する必要があります。

4

2 に答える 2

2

メソッドを使用Whenしてバインディング条件を宣言します。例を以下に示します

kernel.Bind(typeof(IRepository<>))
      .To(typeof(efRepository<>))
      .When(request => request.Service.GetGenericArguments()[0] == typeof(Entity))
      .InRequestScope();

kernel.Bind(typeof(IRepository<>))
      .To(typeof(xrmRepository<>))
      .InRequestScope();

kernel.Get<IRepository<Entity>>(); //will return efRepository<Entity>

kernel.Get<IRepository<int>>(); //will return xrmRepository<int>
于 2013-04-16T22:01:21.550 に答える