【发布时间】:2016-11-25 15:08:57
【问题描述】:
我不得不使用一个已经设置好的基于 Ninject DI 的应用程序,在我正在开发的应用程序的开发过程中,我已经发展并添加了相当多的应用程序。
我现在发现了一个我想纠正的问题。我已经设法使用继承来解决它,但想要一个更清洁的解决方案。
我有两个连接需要注入不同的服务和存储库。然后,我需要将存储库也正确链接到具有相同 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 对象,并将它们作为不同的实例注入到各自的服务中(IPOPService 用于 IPOP_BE_TEST 连接,@987654328 @ 用于 IPOP_BAP 连接)
同样,上面的代码没有达到我想要的效果,但这是我想尝试使用的那种架构。
【问题讨论】:
标签: c# asp.net-mvc dependency-injection ninject