我在这个主题上看到了很多问题和答案,但绝大多数都在处理ASP.Net
或其他基于Web的应用程序以及名为.InRequestScope
的内容。我还没有在Ninject
中使用Windows Application
找到此方法。
我有通常的Unit of Work
(UoW)和Repository
(Repo)类和接口,但我想在每次运行UoW时向两者注入相同的DbContext
来自DIContainer
。我的代码看起来像这样;
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) { }
}
DIContainer拥有以下协会;
Bind<IUnitOfWork>().To<UnitOfWork>().InTransientScope();
Bind<IUnitOfWorkFactory>().ToFactory();
Bind<IMyContext>().To<MyContext>().InSingletonScope();
Bind<IAccountTypeRepository>().To<AccountTypeRepository>().InTransientScope();
我将回到.InSingletonScope();
我看到人们这样做的方式通常是在每个回购的UoW属性中都有这样的代码;
private IAccountRepository _accountRepository;
public IAccountRepository Accounts
{
get
{
if(_accountRepository = null)
{
_accountRepository = new AccountRepository(_context);
}
return _accountRepository;
}
}
从Constructor
中删除注入的存储库,确保存储库的每个实例使用相同的_context。
但是在我看来这会打破这个班级的Dependency Injection
。有没有办法在每次创建UoW
时都这样做;
public TestUnitOfWork(IUnitOfWorkFactory unitOfWork)
{
using (var UoW = unitOfWork.Create())
{
Work done on UoW...
}
}
目前.InSingletonScope
允许这样做,但这是否保持上下文的实例始终打开?介绍与不正确处理上下文相关的错误?
或者为Factory
创建Repositories
并给它们一个上下文参数更好,然后在属性中初始化它就像这样;
private IAccountRepository _accountRepository;
public IAccountRepository Accounts
{
get
{
if(_accountRepository = null)
{
_accountRepository = RepositoryFactory.CreateAccountRepository(_context);
}
return _accountRepository;
}
}
提前感谢您的帮助!
答案 0 :(得分:0)
解决方案是使用Ninject's Extensions.Factory
类并传递IAccountFactory.Create()
来初始化新对象。然后使用DI容器解析其依赖性,并且不会破坏DI方法。