4

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

从我所了解的工作单位是用来封装业务交易。从实施例中我看到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()其类似于上面描述的方法。假设我想在businessMethod2()之内使用businessMethod1(),那么最佳做法是什么。我想分享工作单位,所以我应该把它作为一个论点来传递?即改变上述方法

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的新实例并由所有业务方法共享。在新请求上创建不同的实例。使用单身乌鸦将意味着我不必将其传递给我的任何业务方法,并且可以同时分享它所有的业务方法。

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

+0

这是我一直热衷于研究的东西,我从未见过UoW存储库的良好实现,但我确定它们在某处。 –

回答

2

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

public class MyBusinessService 
{ 

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

    public void businessMethod1() 
    { 
    } 

    public void businessMethod1() 
    { 
    } 
} 

有很多流行的DI框架。选择你认为适合你的东西。

2

这是关于UoW的使用。如果您将UoW的用法放入BusinessMethod1中,则表示它是顶级业务抽象(商业门面)。它可能不应该被其他商业运作使用,因为它会打破它的“顶级”。因此,如果您需要在另一个BusinessMethod2中使用BusinessMethod1中的逻辑,则添加关于UoW存在的逻辑决策是不正确的 - 这会打破关注点的分离。 BusinessMethod应该处理您的应用程序逻辑而不是创建。最简单的办法就是重构你的BusinessMethod1并没有对UOW任何依赖公开共享功能的新方法:

public void BusinessMethod1() 
{ 
    uow u = new uow(); 
    DoSomeWork(); 
    u.save(); 
} 

private void DoSomeWork() 
{ 
    repository1 rep1 = new repository1(uow); //instantiate repository1 
    repository2 rep2 = new repository2(uow); //instantiate repository1 
    rep1.dowork(); 
    rep2.dowork(); 
} 

当然这只是很简单的例子,因为你的方法仍然不遵守的关注点分离 - 他们都做逻辑和对象创建。您应该在其他地方处理UoW和存储库创建,并在其中传递创建的对象。您可以使用@Eranga提到的方法,但如果您的method2想要从method1调用某些东西,则此重构仍将适用。

此重构方法可以建模为低级业务服务和商业门面,但仅在大型项目中需要。在小型项目中,您还可以将与UoW的交互移动到您的“控制器”(可能在Web表单中隐藏代码),因为控制器驱动应用程序逻辑,并知道在单个工作单元中要调用哪些业务方法。