2013-04-16 22 views
5

バインディング私はTEntityから派生したときに、より具体的にxrmRepositoryを使用し、Tに基づいてバインディングを変更したいです。どうすればそれを達成できますか?Ninjectコンテキストは、私は一般的なインタフェース<code>IRepository<T></code>との2つの実装<code>xrmRepository<T></code>と<code>efRepository<T></code></p> <p>を持っているワット/オープンジェネリック

私は現在持っている:

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>を解決しようとすると、それは、連絡先エンティティを継承していても、efRepositoryに行きます。

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

答えて

2

また、このようなバインディングを定義することもできます。私は実行時のパフォーマンスについてはわかりませんが、私はそれがこのように読みやすいと思います。私が何かを見逃していなければ、同じ行動になるはずです。

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

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

編集

目標は、エンティティから、これを継承するすべてのクラスのためのxrmRepositoryを使用する場合、エラー「GenericArgumentsを取得トリック

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

基本クラス "エンティティ"を使用していませんでした。まだefRepositoryに結合しています。クラスそのものを使用している場合(連絡先のように)動作します。 –

+0

EntityのすべてのサブクラスでIRepositoryをxrmRepositoryに解決しますか? – treze

+0

しかし、私はおそらくIXRMRepository:IRepositoryを作成することになるでしょう。なぜなら、私はそれを動作させることができないからです。 –

1

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> 
+0

キープ[0]、「sf2015を行う必要があります.Infrastructure.Xrm.Contact '、on' sf2015.Repositories.sfRepository'1 [T] 'は型パラメータ' T 'の制約に違反しています。 "付随情報:f2015.Infrastructure.Xrm.Contactは、Microsoft.Xrm.Sdk.Entity型です。私はFirst()を[0]に変更しなければならず、xrmRepositoryはEntityとバインドするはずです。更新された質問をご覧ください。 –

+0

@ JoaoLemeは、インタフェース定義とその実装を提供します。また、** Get **と期待される結果を呼び出す例を挙げてください。 –

+0

Getを新しいモジュールから呼び出すときは、GetGenericArguments()を使用すると動作します。First()== typeof(Contact)...そしてkernel.Get >();しかし、継承されたクラスのEntityでバインディングのContactを置き換え、kernel.Get >()を呼び出すと、同じエラーが発生します。ところで、NinjectWebCommonのRegisterServicesの下で同じトラブルシューティングトリック(Entity by Contactを置き換える)をしても動作しません(Eitherwayは私に同じエラーを与えます)。 –

関連する問題

 関連する問題