我如何设计一个在数据访问和域之间可重用的业务逻辑规则;服务”;
本文关键字:业务 之间 服务 规则 数据 访问 一个 | 更新日期: 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
它解释了如何在映射的顶部添加一个层来执行业务功能。
你可能想通过折扣阈值,这样你就不会在每次企业改变主意时都更改你的域对象。