我有一个问题并试着总结一下我准备了一个简单的结构。 第一个方法就像:
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;
}
}
}
}
我想相信这种方式更可测试,但我眼中有两个问题:
BookUnitOfWork
构造函数必须具有越来越多的依赖项。当您使用Ninject或任何其他DI框架实例化它们时,这可能还需要一些额外的工作。BookshelfContext
可能会错误地为每个DI存储库接口提供不同。那么,有没有一种很好的方法来合并每种方法的这些优点呢?
谢谢,