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

问题描述 投票:2回答:1

我在这个主题上看到了很多问题和答案,但绝大多数都是在处理ASP.Net或其他基于Web的应用程序和称为.InRequestScope的东西。我还没有在NinjectWindows Application找到这种方法。

我有通常的Unit of Work(UoW)和Repository(Repo)类和接口,但是我想在每次从DbContext运行UoW时向两者注入相同的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; 
    }
}

在此先感谢您的帮助!

c# dependency-injection ninject repository-pattern unit-of-work
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.