其中大部分将通过注入一个存储库来完成,该存储库的实现会提供那些未跟踪的对象或对平面文件进行读/写操作。
概念存储库所做的很多事情都与 UoW 交叉。回购实现最终有很多这样的:
public class MyRepository : IWhateverRepository
{
// ...
public Customer GetCustomerByName(string customerName)
{
using (var db = new MyContext())
{
var customer = db.Customers.Where(cust => cust.Name == customerName).SingleOrDefault();
return customer;
}
}
public Customer StoreCustomer(Customer customer)
{
using (var db = new MyContext())
{
db.Entry(customer).State = customer.ID == 0 ? EntityState.Added : EntityState.Modified;
db.SaveChanges();
}
}
}
如您所见,UoW 的使用并不多。我认为使用存储库时 EF 的大部分用处在于不必手动编写 SQL。
但是,当没有存储库抽象并且业务逻辑直接与实体和上下文一起工作时,UoW 运行良好。例如,在 UI MVC 服务层场景中,您可能让 MVC 控制器指示服务层创建新发票:
IMyService svc = new MyServiceLayer();
IInvoice invoice = svc.CreateInvoiceForCustomer(customer, items, paymentInfo);
InvoiceViewModel invoiceVm = Map(invoice);
return RedirectToAction("Display", "Invoice", invoiceVm);
您可以想象服务层可能会执行以下操作:
public ServiceResponse<Invoice> CreateInvoiceForCustomer(Customer customer, IEnumerable<InvoiceItem> items, PaymentInfo paymentInfo)
{
using (var db = new MyContext())
{
db.Entry(customer).State = customer.ID == 0 : EntityState.Added : EntityState.Modified;
var invoice = new Invoice
{
Customer = customer,
InvoiceDate = _timeService.Now(),
PaymentInfo = paymentInfo
};
foreach (var item in items)
invoice.Items.Add(items);
db.Invoices.Add(invoice);
db.SaveChanges();
return new SeviceResponse<Invoice>
{
IsSuccess = true,
Data = invoice
};
}
}
在此示例中,UoW 模式充当事务的替代品。您无需弄脏手即可获得原子性。
UoW 的真正强大之处在于有状态系统,例如 WPF,您可以在其中拥有一个长期存在的上下文,用于处理在不同线程上异步执行的大型命令队列。