我正在学习EF并且已经看过很多例子,在我学习的过程中,我开始了解使用存储库和工作单元模式。我知道为什么要使用存储库但我对工作单元的理解还不是真的。
没有理解让DAL理解变得困难。请指导我。
由于
答案 0 :(得分:34)
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
答案 1 :(得分:26)
企业软件开发中最常见的设计模式之一是工作单元。根据Martin Fowler的说法,Unit of Work pattern“维护一个受业务事务影响的对象列表,并协调写入更改和解决并发问题。”
工作单元模式不一定是您自己明确构建的模式,但该模式几乎出现在我所知道的每个持久性工具中。 NHibernate中的ITransaction接口,LINQ to SQL中的DataContext类和实体框架中的ObjectContext类都是工作单元的示例。就此而言,古老的DataSet可以用作工作单元。
详细信息请点击here阅读这篇文章,这是一篇不错的文章。
有关在ASP.NET MVC(MVC 4和EF 5)应用程序中实现存储库和工作单元模式的教程(第9步,共10步),请单击here
对于EF 6和MVC 5教程,请单击here
我希望这会有所帮助,它帮助了我!
答案 2 :(得分:14)
工作单元
维护受业务交易影响的对象列表并协调写作
出于变化和并发问题的解决方案。
{{ 1}}
{{ 1}}
当您将数据导入和导出数据库时,重要的是 跟踪你改变了什么;否则,该数据将不会 写回数据库。同样,你必须插入新的 您创建的对象并删除您删除的任何对象。
您可以在对对象模型进行每次更改时更改数据库,但是 这可能导致许多非常小的数据库调用,最终结束 很慢。此外,它要求您进行交易 打开整个互动,如果你有一个,这是不切实际的 跨越多个请求的业务事务。情况是这样的 更糟糕的是,如果你需要跟踪你所读过的对象,那么你就更好了 可以避免不一致的读取。
工作单元会跟踪您在业务中所做的一切 可能影响数据库的事务。当你完成后,它就会成功 结果需要做的一切都是为了改变数据库 你的工作。