我正在学习 EF 并且看过很多例子,在学习过程中我开始了解使用存储库和工作单元模式。我知道为什么要使用存储库,但我并不真正了解工作单元。
没有理解会使 DAL 的理解变得困难。请指导我。
谢谢
我正在学习 EF 并且看过很多例子,在学习过程中我开始了解使用存储库和工作单元模式。我知道为什么要使用存储库,但我并不真正了解工作单元。
没有理解会使 DAL 的理解变得困难。请指导我。
谢谢
DataContext 或 ObjectContext 是工作单元。
因此,您的 DAL 将保存、删除和检索对象,而您的 DataContext/ObjectContext 将跟踪您的对象、管理事务并应用更改。
这是一个示例,只是为了说明解决方案的想法。
using(var context = new ObjectContext()) { // Unit of Work
var repo = new ProductRepository(context);
var product = repo.GetXXXXXXX(...);
...
// Do whatever tracking you want to do with the object context. For instance:
// if( error == false) {
// context.DetectChanges();
// context.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
// }
}
您的存储库将如下所示:
public abstract class Repository {
public Respository(ObjectContext context){
CurrentContext = context;
}
protected ObjectContext CurrentContext { get; private set; }
}
public class ProductRespository : Repository {
public ProductRespository(ObjectContext context) : base(context){
}
public Product GetXXXXXX(...){
return CurrentContext... ; //Do something with the context
}
}
另一种方法是将工作单元(对象上下文)全局放置:
您需要定义您的工作单元范围。对于此示例,它将是一个 Web 请求。在现实世界的实现中,我会为此使用依赖注入。
public static class ContextProvider {
public static ObjectContext CurrentContext {
get { return HttpContext.Items["CurrentObjectContext"];
}
public static void OpenNew(){
var context = new ObjectContext();
HttpContext.Items["CurrentObjectContext"] = context;
}
public static void CloseCurrent(){
var context = CurrentContext;
HttpContext.Items["CurrentObjectContext"] = null;
// Do whatever tracking you want to do with the object context. For instance:
// if( error == false) {
// context.DetectChanges();
// context.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
// }
context.Dispose();
}
}
在此示例中,ObjectContext 是工作单元,它将存在于当前请求中。在您的全局 asax 中,您可以添加:
protected void Application_BeginRequest(object sender, EventArgs e){
ContextProvider.OpenNew();
}
protected void Application_EndRequest(object sender, EventArgs e){
ContextProvider.CloseCurrent();
}
在您的存储库中,您只需调用ContextProvider.CurrentContext
企业软件开发中最常见的设计模式之一是工作单元。根据 Martin Fowler 的说法,工作单元模式“维护受业务事务影响的对象列表,并协调更改的写入和并发问题的解决”。
工作单元模式不一定是您自己明确构建的东西,但该模式出现在我所知道的几乎所有持久性工具中。NHibernate 中的 ITransaction 接口、LINQ to SQL 中的 DataContext 类和实体框架中的 ObjectContext 类都是工作单元的示例。就此而言,古老的 DataSet 可以用作工作单元。
更多详细信息请点击这里阅读这篇文章,这是一篇很好的文章。
有关在 ASP.NET MVC(MVC 4 和 EF 5)应用程序中实现存储库和工作单元模式的教程(10 个中的 9 个),请单击此处
EF 6 和 MVC 5 教程请点击这里
我希望这会有所帮助,它帮助了我!
工作单元
维护受业务事务影响的对象列表,并协调更改的写入和并发问题的解决。
当您将数据导入和导出数据库时,跟踪您所做的更改非常重要。否则,该数据将不会被写回数据库。同样,您必须插入您创建的新对象并删除您删除的任何对象。
您可以在每次更改对象模型时更改数据库,但这可能会导致大量非常小的数据库调用,最终会非常慢。此外,它要求您为整个交互打开一个事务,如果您有一个跨越多个请求的业务事务,这是不切实际的。如果您需要跟踪已读取的对象以避免不一致的读取,情况会更糟。
工作单元跟踪您在可能影响数据库的业务事务期间所做的一切。完成后,它会计算出根据您的工作更改数据库需要做的所有事情。