2011-12-20 8 views
0

を作成する私はこのようになります結合している:WithConstructorArgumentを使用し、結合したタイプ

kernel.Bind<IRepository<Holiday>>().To<RepositoryBase<Holiday>>(); 

問題はRepositoryBaseは、コンテキストと呼ばれたUnitOfWorkのコンストラクタのPARAMTERを取ることです。これは、それ自体では問題ではありません。 Ninjectはそれを解決する必要があります。私が2つのUnitOfWork実装を持っていることを除いて、両方とも属性弁別子を使ってバインドされています。

kernel.Bind<IUnitOfWork>().To<MS_DevEntities>().WhenTargetHas<MsDataAttribute>() 
    .InRequestScope(); 

IRepositoryを作成するときに、MS_DevEntitiesを使用して作成する必要があるかどうかを指定できますか?

確かに、私はこのような何かができる:私は.InRequestScope()のライフサイクルを使用していますので、特に

kernel.Bind<IRepository<Holiday>>().To<RepositoryBase<Holiday>>() 
    .WithConstructorArgument("context", new MS_DevEntities()); 

しかし、私は、Ninjectはインスタンスを作成してもらうことを好むだろう。

提案がありますか?

EDIT:しかし、私は今、これらの数十に自分自身を見つけると、彼らは多くを行うが、余分なを追加しない

public class HolidayRepository : RepositoryBase<Holiday>, IHolidayRepository 
{ 
    public HolidayRepository([MsData]IUnitOfWork context) : base(context){} 
} 

以前、私はこのように見えたクラスを使用していました新しいリポジトリを作成する必要があるときに動作します。私はちょうどバインディングのこれらを直接マップしたいと思います。

EDIT2:

私はこのような何かを行うことができたとしますが、それは一種のハックようです。より良い方法がありますか?

kernel.Bind<MS_DevEntities>().ToSelf().InRequestScope(); 
kernel.Bind<IRepository<Holiday>>().To<RepositoryBase<Holiday>>() 
    .WithConstructorArgument("context", 
     (context) => context.Kernel.Get<MS_DevEntities>()); 
+0

を使用して

第二approchは、私がこれを正しく理解していますか? IRepository などのすべてのタイプのバインドがあり、IRepository <>は一般的ではありません。また、UoW1とUoW2を必要とするタイプのものもありますか?または、リポジトリの場合にUoW1またはUoW2を取るための基準は何ですか?エンティティの属性? –

+0

@RemoGloor - Ninjectのすべての特殊なタイプに一般的にバインドできますか?もしそうなら、それは本当にクールです。しかし、いいえ、私はジェネリックバインディングを持っていません。私はすべて私のIRepository タイプを束縛しているので、それぞれにどのUoWを使用するかを指定する必要があります。私は派生クラスで正しいバインディングを選択するために属性を使用していましたが、ジェネリックベース以外のリポジトリに余分なコードを追加していないときに、より多くの作業を追加していました。 –

+0

@RemoGloor - 私がバインディングで複製しようとしているものの例を上の編集を参照してください。 –

答えて

5

など。エンティティに属性を入れて、このようなものを使用します。

kernel.Bind(typeof(IRepository<>)).To(typeof(RepositoryBase<>)); 
kernel.Bind<IUnitOfWork>().To<MS_DevEntities>() 
     .When(r => EntityHas<MsData>(r)); 
kernel.Bind<IUnitOfWork>().To<TheOtherOne_DevEntities>() 
     .When(r => EntityHas<TheOtherData>(r)); 

bool EntityHas<TAttribute>(IRequest r) 
{ 
    return r.Target.Member.ReflectedType.IsGenericType && 
      r.Target.Member.ReflectedType.GetGenericArguments()[0] 
       .GetCustomAttributes(typeof(TAttribute), false).Any(); 
} 

あなたはこのWhen条件を使用してすべてを行うと、あなたは、このエンティティタイプのために使用する必要がUOWどこかを検索するr.Target.Member.ReflectedType.GetGenericArguments()[0]からエンティティタイプを取ることができます。コンフィグ

kernel.Bind<IUnitOfWork>().To<TheOtherOne_DevEntities>() 
     .When(r => EntityNeedsUoW(r, 1)); 

bool EntityNeedsUoW(IRequest r, int id) 
{ 
    return UoWConfig.GetDbIdForEntity(
     r.Target.Member.ReflectedType.GetGenericArguments()[0]) == id; 
} 
+0

私の2番目の更新を参照してください。これについての考えは? –

+0

私は私が提案したものに行きます。あなたに合ったWhen条件を書いてください。例えば。設定ファイル/クラス内で検索を行い、提案したような属性を追加するか、あなたに合ったものを追加します。 –

+0

これは興味深い考えです。エンティティで属性を使用することは実際考えていませんでした。私のエンティティはT4テンプレートによって生成され、それはすべての部分クラスを作成することを意味し、これはやはり巨大なメンテナンスの頭痛です。しかし、考えていること。 –

関連する問題