我刚刚开始阅读有关使用存储库和工作单元模式的信息。我目前正在尝试在 asp.net web 表单应用程序中将它与 Entity Framework 一起使用。然而,我确实有一个问题,我不确定我是否能够以简单的方式解释。

据我了解,工作单元用于封装业务事务。从我看到的例子中,uow 的使用方式如下

 businessMethod1()
 {
    uow u = new uow(); //instantiate unit of work
    repository1 rep1 = new repository1(uow); //instantiate repository1
    repository2 rep2 = new repository2(uow); //instantiate repository1
    rep1.dowork();
    rep2.dowork();
    u.save(); //save the changes made to the database. (effectively saving changes made
              //in both repository classes
 }

现在假设我有一个类似于上述方法的 businessMethod2()。假设我想在 businessMethod1() 中使用 businessMethod2() 什么是最佳实践。我想共享工作单元,所以我应该将它作为参数传递吗?即改变上面提到的方法
businessMethod1(uow u)
{
    bool isNew = false;
    if (u == null)
    {
        u = new uow();
        isNew = true;
    }

    repository1 rep1 = new repository1(uow); //instantiate repository1
    repository2 rep2 = new repository2(uow); //instantiate repository1
    rep1.dowork();
    rep2.dowork();

    if (isNew)
      u.save(); //save the changes made to the database.
}

这是处理此问题的正确方法吗?

我在想更好的方法是使用单例 uow。在每个页面请求上,都会创建一个新的 uow 实例并由所有业务方法共享。在一个新的请求上创建一个不同的实例。使用单例 uow 意味着我不必将它传递给我的任何业务方法,并且可以同时与我的所有业务方法共享它。

这样做有什么缺点吗?还有没有更好的方法来实现这一点?

最佳答案

解决这个问题的一种方法是使用依赖注入(inject)。通常构造函数注入(inject)与单个入口点一起使用来解决依赖关系。

public class MyBusinessService
{

   public MyBusinessService(Repository1 repository1, Repository2, uow u)
   {
        // assign the params to fields
   }

   public void businessMethod1()
   {
   }

   public void businessMethod1()
   {
   }
}

有许多流行的 DI 框架。选择你认为对你有用的东西。

关于asp.net - Entity Framework asp.net 应用程序中的 UOW 和存储库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8980007/

10-09 05:28