我如何设计一个在数据访问和域之间可重用的业务逻辑规则;服务”;

本文关键字:业务 之间 服务 规则 数据 访问 一个 | 更新日期: 2023-09-27 18:22:48

我使用的是带有C#的MVC3,NHibernate作为ORM,StructureMap作为IoC容器

也许我的术语是,但我会尝试一个简单的例子

假设我有一个域对象:

class Product
{
    decimal Price;
}

假设我们允许某些促销,我现在想要2个功能:

GetAllDiscountedProducts()//列出所有折扣商品IsDiscounted(Product p)//检查给定产品是否可以打折

确定产品是否打折的商业规则是,产品的价格是否高于一定的价值,比如说,任何超过50美元的东西都是可以打折的

由于我使用NHibernate进行数据访问,我倾向于使用QueryOver语法,因此GetAllDiscountedProducts可以是:

//GetAllDiscountedProducts()
session.QueryOver<Product>().(p => p.Price > 50.00)

但是,由于我对业务规则使用了特定于数据访问的查询,我将不得不复制IsDiscounted 的逻辑

bool IsDiscounted(Product p)
{
    return p.Price>50;
}

有没有一种方法可以集中业务逻辑?

我如何设计一个在数据访问和域之间可重用的业务逻辑规则;服务”;

这就是图片中的Domain层。您应该有一个位于Nhibernate层和控制器级别之间的Product.Domain项目。Product.Domain应该有一个ProductBLL类,该类具有方法

bool IsDiscounted(Product p) 
{
session.QueryOver<Product>().(p => p.Price > 50.00) 

}

这种方法应该在整个应用程序中使用,以获得折扣产品。

您可以使用另一种方法返回所有折扣产品。

GetDiscountedProducts()
{
session.QueryOver<Product>().(p => p.Price > 50.00) 
}

记住,域层是用来集中所有域逻辑的,在UI层或数据层中都不应该有任何域逻辑。

域是逻辑,它是系统的真正点。域逻辑的更改应该只发生在一个地方,即域层。

通过将域的行为放在单独的子例程中来启动域层,随着系统变得越来越复杂,将它们分解为单独的类。随着复杂性的增加,更多的类被划分为单独的名称空间,并开始使用依赖注入。

最初,每个用户操作都有一个例程。然后引入更多的类和对象。与其说一个例程具有用户操作的所有逻辑,不如说每个对象都具有与其相关的逻辑的一部分

简而言之,你们领域层的发展将是一个进化的过程。

请参阅这篇文章

http://nhibernate.info/blog/2009/09/07/part-8-daos-repositories-or-query-objects.html

它解释了如何在映射的顶部添加一个层来执行业务功能。

你可能想通过折扣阈值,这样你就不会在每次企业改变主意时都更改你的域对象。