Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何设计可在数据访问和域之间重用的业务逻辑规则;服务“;_C#_Asp.net Mvc 3_Nhibernate - Fatal编程技术网

C# 如何设计可在数据访问和域之间重用的业务逻辑规则;服务“;

C# 如何设计可在数据访问和域之间重用的业务逻辑规则;服务“;,c#,asp.net-mvc-3,nhibernate,C#,Asp.net Mvc 3,Nhibernate,我使用MVC3和C#,NHibernate作为ORM,StructureMap作为IoC容器 也许我的术语是正确的,但我将尝试一个简单的例子 假设我有一个域对象: class Product { decimal Price; } 假设我们允许某些促销,我现在想要两个功能: GetAllDiscountedProducts()//列出所有折扣产品 IsDiscounted(产品p)//检查给定产品是否可以打折 确定产品是否打折的商业规则是,产品的价格是否高于某个特定值,比如说,超过50美

我使用MVC3和C#,NHibernate作为ORM,StructureMap作为IoC容器

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

假设我有一个域对象:

class Product
{
    decimal Price;
}
假设我们允许某些促销,我现在想要两个功能:

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

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

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

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

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

这是域层进入图片的原因。您应该有一个Product.Domain项目,它位于Nhibernate层和控制器层之间。域应具有具有方法的ProductBLL类

bool IsDiscounted(Product p) 

{

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


}
bool已结算(产品p)
{
session.QueryOver()(p=>p.Price>50.00)
}
此方法应在整个应用程序中使用,以获得折扣产品

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

GetDiscountedProducts()
{

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

}
GetDiscountedProducts()
{
session.QueryOver()(p=>p.Price>50.00)
}
请记住,域层用于集中所有域逻辑,在UI层或数据层中都不应该有任何域逻辑

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

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

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

简而言之,域层的开发将是一个渐进的过程。

请参阅本文

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


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

我仍然很困惑。分离业务逻辑和UI对我来说很有意义,但在您的示例中,您复制了检查折扣的逻辑。这正是我试图避免的。我复制现有代码只是作为一个示例。实际上,您应该有一个DiscountHelper类,它提供应用折扣的逻辑。DiscountHelper类和GetDiscountEndProducts()为产品提供特定折扣。DiscountHelper类可以寻求一组DisCountStrategy对象的帮助来确定折扣。
GetDiscountedProducts()
{

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

}