如何在C#中使用依赖注入与工作单元和存储库? (不是基于网络的应用程序)

时间:2018-06-13 19:06:01

标签: c# dependency-injection ninject repository-pattern unit-of-work

我在这个主题上看到了很多问题和答案,但绝大多数都在处理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; 
    }
}

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

解决方案是使用Ninject's Extensions.Factory类并传递IAccountFactory.Create()来初始化新对象。然后使用DI容器解析其依赖性,并且不会破坏DI方法。