0

我使用 MVC3 和 C#,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;
}

有没有办法集中业务逻辑?

4

2 回答 2

0

请看这个帖子

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

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

您可能希望通过折扣阈值,这样您就不会在每次业务改变主意时都更改域对象。

于 2013-07-17T15:21:20.413 回答
0

这是Domain层进来的画面。您应该有一个位于 Nhibernate Layer 和 Controller Level 之间的 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 层或数据层中不应该有任何域逻辑。

域是系统的真正点的逻辑。域逻辑的变化应该只发生在一个地方,那就是域层。

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

最初,您将为每个用户操作设置一个例程。然后你引入更多的类和对象。每个对象都采用与其相关的逻辑的一部分,而不是一个例程拥有用户操作的所有逻辑。

总之,你的领域层的发展将是进化的过程。

于 2013-07-17T05:49:23.587 回答