在C#中,如何将依赖项注入与工作单元和存储库一起使用?(不是基于web的应用程序)
我看到了很多关于这个主题的问题和答案,但是绝大多数都是关于在C#中,如何将依赖项注入与工作单元和存储库一起使用?(不是基于web的应用程序),c#,dependency-injection,ninject,repository-pattern,unit-of-work,C#,Dependency Injection,Ninject,Repository Pattern,Unit Of Work,我看到了很多关于这个主题的问题和答案,但是绝大多数都是关于ASP.Net或其他基于web的应用程序以及一些称为.InRequestScope的东西。我还没有在带有Windows应用程序的Ninject中找到此方法 我有通常的工作单元(UoW)和存储库(Repo)类和接口,但每次从双容器运行UoW时,我都希望将相同的DbContext。我的代码如下所示 public class UnitOfWork : IUnitOfWork, IDisposable { private readonly
ASP.Net
或其他基于web的应用程序以及一些称为.InRequestScope
的东西。我还没有在带有Windows应用程序的Ninject
中找到此方法
我有通常的工作单元
(UoW)和存储库
(Repo)类和接口,但每次从双容器运行UoW时,我都希望将相同的DbContext
。我的代码如下所示
public class UnitOfWork : IUnitOfWork, IDisposable
{
private readonly FinancialContext _context;
private IAccountRepository _accountRepository;
public IAccountRepository Accounts
{
get { return _accountRepository; }
}
UnitOfWork(IMyContext context, IAccountRepository accountRepository)
{
_context = context;
_accountRepository = accountRepository;
}
public void SaveChanges()
{
_context.SaveChanges();
}
public void Dispose()
{
_context.Dispose();
}
}
public class AccountRepository : Repository<Account>, IAccountRepository
{
public AccountRepository(IMyContext context) : base(context) { }
}
并通过确保存储库的每个实例使用相同的上下文,从构造函数中删除注入的存储库
然而在我看来,这打破了这个类的依赖注入。在每次创建UoW
时是否有这样的方法
public TestUnitOfWork(IUnitOfWorkFactory unitOfWork)
{
using (var UoW = unitOfWork.Create())
{
Work done on UoW...
}
}
目前,.InSingletonScope
允许这样做,但这是否始终保持上下文实例的打开状态?引入与未正确处理上下文相关的错误
或者最好为存储库
创建一个工厂
,并给它们一个上下文参数,然后在属性中像这样初始化它
private IAccountRepository _accountRepository;
public IAccountRepository Accounts
{
get
{
if(_accountRepository = null)
{
_accountRepository = RepositoryFactory.CreateAccountRepository(_context);
}
return _accountRepository;
}
}
提前感谢您的帮助 解决方案是使用Ninject的Extensions.Factory
类并传入IAccountFactory.Create()
初始化新对象。然后,它使用DI容器来解决其依赖关系,并且不会破坏DI方法。这一方法可能会对您有所帮助:我正努力解决完全相同的难题。您是否已经找到了一个可行的解决方案,或者您是否已经采取了重新安置工厂的路线?我会继续搜索…嗨,Michael,最后我使用了工厂方法,Ninject的扩展。工厂使用DI来解决它的依赖关系,所以如果你对一个对象使用Factory.Create(),它也会解决对象的依赖关系,所以我相信这仍然是非常可测试和干净的!
public TestUnitOfWork(IUnitOfWorkFactory unitOfWork)
{
using (var UoW = unitOfWork.Create())
{
Work done on UoW...
}
}
private IAccountRepository _accountRepository;
public IAccountRepository Accounts
{
get
{
if(_accountRepository = null)
{
_accountRepository = RepositoryFactory.CreateAccountRepository(_context);
}
return _accountRepository;
}
}