나는 이미 성장한 Ninject DI 기반 응용 프로그램을 사용하여 작업해야만 재능이 있었고 현재 작업중인 응용 프로그램의 개발에 상당히 추가되었습니다. .Ninject를 사용한 종속성 삽입 다른 인스턴스의 동일한 객체 공유
이제 문제를 해결하고 싶습니다. 상속을 사용하여 해결하려고했지만 더 깨끗한 솔루션을 원합니다.
다른 서비스 및 저장소에 주입하려면 두 개의 연결이 필요합니다. 그런 다음 저장소가 정확하게 UnitOfWork
의 올바른 서비스에 올바르게 연결되어야합니다.
나는 상속 및 전문화 없이는 불가능한 것을 묻고 있을지 모르지만 그것이 내가 묻는 이유입니다.
기본 Repository
및 UnitOfWork
클래스의 하위 클래스를 생성하여이 문제를 해결할 수 있었지만 기본 클래스를 구현하는 것 외에는 아무런 변화가 없었습니다. 난 그냥 하위 클래스의 개념을 완전히 수퍼 클래스의 기능을 기본적으로 빈 중괄호와 함께 생성자에서 떨어져 의존하고 싶지 않아,이 사실 OOP 그냥이 문제를 해결하려면 보이지 않는다. 그래서 DI에서 가능한 한 일류 솔루션을 활용하여 더 나은 솔루션을 모색했습니다.
그래서 이것은 내가 남아있는 무슨이다. 무엇 내가 알고 싶은
...
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_BE_TEST 연결에 IPOPService
(각 서비스에 서로 다른 인스턴스를 주입하는 것이 가능하다 IPOP_BAP 연결을위한 QuoteService
)
다시 위의 코드는 내가 원하는 것을 얻지 못한다. 그러나 이것은 내가 작동하도록하기 위해 놀고 싶은 아키텍처의 일종이다.
@Zoltan 입력에 감사드립니다. MVC 사이트에서 작업 중이며 일부 혼란을 야기 할 수있는 질문에 약간의 변경을가했습니다. 위의 대답에 대해서는 어떻게 든 정확한 'UnitOfWork'와'Repository'(올바른 db 연결을 사용하여)를 위의 두 가지 서로 다른 서비스에 매핑 할 수 있기를 원합니다. 나는 가능하다면 그 일을 할 수있는 몇 가지 Ninject 로직을 놓치고 있다고 생각한다. – Saleh