在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; 
    }
}