を作成する私はこのようになります結合している: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>());
を使用して
第二approchは、私がこれを正しく理解していますか? IRepositoryなどのすべてのタイプのバインドがあり、IRepository <>は一般的ではありません。また、UoW1とUoW2を必要とするタイプのものもありますか?または、リポジトリの場合にUoW1またはUoW2を取るための基準は何ですか?エンティティの属性? –
@RemoGloor - Ninjectのすべての特殊なタイプに一般的にバインドできますか?もしそうなら、それは本当にクールです。しかし、いいえ、私はジェネリックバインディングを持っていません。私はすべて私のIRepositoryタイプを束縛しているので、それぞれにどのUoWを使用するかを指定する必要があります。私は派生クラスで正しいバインディングを選択するために属性を使用していましたが、ジェネリックベース以外のリポジトリに余分なコードを追加していないときに、より多くの作業を追加していました。 –
@RemoGloor - 私がバインディングで複製しようとしているものの例を上の編集を参照してください。 –