私は成長し、私が取り組んでいるアプリケーションの開発にかなり追加した、すでにセットアップされたNinject DIベースのアプリケーションで作業しなければならなかったので才能を発揮しました。Ninjectによる依存性注入は異なるインスタンスで同じオブジェクトを共有します
ここで私が訂正したい問題が見つかりました。私は継承を使用して回避することができましたが、よりクリーンなソリューションを望みます。
私は異なるサービスとリポジトリに注入するために2つの接続が必要です。私はその後、同じUnitOfWork
を持つ正しいサービスに正しくリンクされるようにリポジトリを必要とします。
私は、継承と専門化なしでは不可能なことを尋ねているかもしれないと思いますが、それが私が求めている理由です。
メインのRepository
クラスとUnitOfWork
クラスのサブクラスを作成することでこれを解決することができましたが、基本クラスを実装すること以外は何もしません。 私はちょうどコンストラクタから離れて基本的に空の中括弧を持つスーパークラスの機能に完全に依存しているサブクラスのアイデアが好きではありません、私には、この問題を解決するために真のOOPのように見えません。そこで私は可能な限りDIで1つのクラスのソリューションを利用するより良いソリューションを模索しました。
は、これは私が残されていますものです。私が知りたいのは何
...
public class UnitOfWork : IUnitOfWork
{
private static readonly log4net.ILog log = log4net.LogManager.GetLogger("UnitOfWork");
public DbContext DataContext { get; set; }
public UnitOfWork(string connectionString)
{
DataContext = new DbContext(connectionString);
}
public void Commit()
{
...
}
}
...
public class Repository<T> : IRepository<T> where T : class
{
public IUnitOfWork unitOfWork { get; set; }
private readonly IDbSet<T> dbSet;
//private static readonly log4net.ILog log = log4net.LogManager.GetLogger("Repository");
public Repository(IUnitOfWork unitOfWork)
{
this.unitOfWork = unitOfWork;
dbSet = this.unitOfWork.DataContext.Set<T>();
}
...
}
...
public class IPOPDataModules : NinjectModule
{
public override void Load()
{
Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope().WithConstructorArgument("connectionString", ConfigurationManager.ConnectionStrings["IPOP_BE_TESTEntities"].ConnectionString);
Bind<IRepository<tOrder>>().To<Repository<tOrder>>().InRequestScope();
}
}
...
public class DataModules : NinjectModule
{
public override void Load()
{
Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope().WithConstructorArgument("connectionString", ConfigurationManager.ConnectionStrings["IPOP_BAPSEntities"].ConnectionString);
Bind<IRepository<Data.Quote>>().To<Repository<Data.Quote>>().InRequestScope();
}
}
...
public class QuoteService : IQuoteService
{
private IUnitOfWork unitOfWork;
private IRepository<Data.Quote> quoteRepository;
public QuoteService(IUnitOfWork unitOfWork, IRepository<Data.Quote> quoteRepository)
{
...
}
}
...
public class IPOPService : IIPOPService
{
private IUnitOfWork unitOfWork;
private IRepository<Data.tOrder> tOrderRepository;
public IPOPService(IUnitOfWork unitOfWork, IRepository<Data.tOrder>)
{
...
}
}
され、二つの異なる接続によって同じUnitOfWork
とRepository
オブジェクトを共有することが可能であり、それらはIPOP_BAP接続用QuoteService
、IPOP_BE_TEST接続用の各サービス(IPOPService
になど、異なるインスタンスを注入しています)
上記のコードは、私が欲しいと望んでいたものではありませんが、これはこれを動作させるために遊びたいアーキテクチャのようなものです。
@ Zoltanの入力をありがとう、私はMVCサイトで作業していると私はうまくいけばいくつかの混乱に対処する必要があります質問にいくつかの変更を加えました。上記の答えに関して、私は何とか正しい 'UnitOfWork'と' Repository'(適切なdb接続で)を上記の2つの異なるサービスにマップしたいと考えています。可能であれば、可能な場合があるいくつかのNinjectロジックが欠けていると思います。 – Saleh