如何在工作单元上使用更好的依赖注入?

时间:2017-04-09 13:32:01

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

我有一个问题并试着总结一下我准备了一个简单的结构。 第一个方法就像:

IBookUnitOfWork.cs

public interface IBookUnitOfWork : IDisposable
    {
        IBookRepository BookRepository { get; private set; }
        IOrderRepository OrderRepository { get; private set; }
        int Complete();
    }

BookUnitOfWork.cs

public class BookUnitOfWork : IBookUnitOfWork
    {
        private BookshelfContext _context;
        public IBookRepository BookRepository { get; private set; }
        public IOrderRepository OrderRepository { get; private set; }

        public BookUnitOfWork(BookshelfContext context)
        {
            _context = context;
            BookRepository = new BookRepository(context);
            OrderRepository = new OrderRepository(context);
        }

        public int Complete()
        {
            return _context.SaveChanges();
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        private void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (_context != null)
                {
                    _context.Dispose();
                    _context = null;
                }
            }
        }
    }

HomeController.cs

public class HomeController : Controller
    {
        private readonly IBookUnitOfWork _bookUnitOfWork;

        public HomeController(IBookUnitOfWork bookUnitOfWork)
        {
            _bookUnitOfWork= bookUnitOfWork;
        }
        public ActionResult Index()
        {
            using (var Uow = _bookDemandUnitOfWork)
            {
                var Book = Uow.MemberBookDemandRepository.FirstOrDefault(c => c.Id == bookId);
                Uow.OrderRepository.Add(new Order { Book = Book } );

                Uow.Complete();
            }
            return View();
        }
    }

所以,我不知道如何为此编写单元测试。因为IBookUnitOfWork在构造函数中包含2个存储库接口。因此,它紧密耦合,我对吗?  这种方法的一个主要优点是它们具有相同的 DbContext,它是作为构造函数参数给出的。

至于第二方法,如果我要将工作单位改为:

BookUnitOfWork.cs

public class BookUnitOfWork : IBookUnitOfWork
    {
        private BookshelfContext _context;
        private IBookRepository _bookRepository;
        private IOrderRepository _orderRepository;

        public BookUnitOfWork(BookshelfContext context, IBookRepository bookRepository, IOrderRepository orderRepository)
        {
            _context = context;
            _bookRepository = bookRepository;
            _orderRepository = orderRepository;
        }

        public int Complete()
        {
            return _context.SaveChanges();
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        private void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (_context != null)
                {
                    _context.Dispose();
                    _context = null;
                }
            }
        }
    }

我想相信这种方式更可测试,但我眼中有两个问题:

  1. 随着需要更多的存储库,BookUnitOfWork构造函数必须具有越来越多的依赖项。当您使用Ninject或任何其他DI框架实例化它们时,这可能还需要一些额外的工作。
  2. BookshelfContext可能会错误地为每个DI存储库接口提供不同
  3. 那么,有没有一种很好的方法来合并每种方法的这些优点呢?

    谢谢,

0 个答案:

没有答案