Frameworks 实体框架POCOs中使用分部类的业务逻辑?

Frameworks 实体框架POCOs中使用分部类的业务逻辑?,frameworks,entity-framework-4,entity,poco,partial-classes,Frameworks,Entity Framework 4,Entity,Poco,Partial Classes,我的业务逻辑可以位于业务逻辑/服务层,也可以添加到利用部分类功能的扩展域类(EF T4生成的POCO)的新成员中 所以我可以: a) bool OrderBusiness.ordercancelletonline(订单订单)。。或(按订单) 或 b) bool order.canbecancelletonline()。。i、 是订单本身知道是否可以取消 对我来说,选项b)更像是面向对象的。但是,选项a)允许应用更复杂的逻辑,例如使用其他域对象或服务 目前,我将两者混合在一起,这看起来并不优雅 任

我的业务逻辑可以位于业务逻辑/服务层,也可以添加到利用部分类功能的扩展域类(EF T4生成的POCO)的新成员中

所以我可以:

a)
bool OrderBusiness.ordercancelletonline(订单订单)
。。或(按订单)

b)
bool order.canbecancelletonline()
。。i、 是订单本身知道是否可以取消

对我来说,选项b)更像是面向对象的。但是,选项a)允许应用更复杂的逻辑,例如使用其他域对象或服务

目前,我将两者混合在一起,这看起来并不优雅


任何关于这方面的指导都将不胜感激

一个常见的问题,也是一个部分主观的问题

依我看,你应该选择A选项

POCO应该就是那个“普通的旧CLR”对象。如果您开始对它们应用业务逻辑,它们就不再是POCO了。:)

您当然可以将业务逻辑与POCO放在同一个程序集中,只是不要直接向它们添加方法,而是创建帮助器类来简化业务规则。POCO唯一应该具备的是映射到域模型的属性

这取决于您的业务规则有多复杂。在我们的应用程序中,业务规则非常简单,因此我们使用选项A


<>但是如果您的业务规则开始变得混乱,请考虑使用<强>规范模式。< /强>

对我来说,OO的关键是告诉对象为您做事情。您不会提取属性并自己(在助手类或其他类中)做出决策


因此,我同意你关于选项b)的主张。因为您需要额外的逻辑,所以在向其他辅助对象传递引用以便它们协作的同时对对象执行操作并没有坏处。您是在操作本身时执行此操作,还是使用这些协作实体预填充订单对象,在很大程度上取决于您当前的情况。

您还可以使用POCO的扩展方法来包装bll方法。 所以你可以继续使用你现在的bll。 在c#中,类似于:

public static class OrderBusiness <- everything must be static, class and method
{
  public static bool CanBeCancelledOnline(this Order order) <- notice the 'this'
  {
    logic ...

publicstaticclass OrderBusiness这可能取决于应用程序的复杂性,并且需要根据经验进行判断。简单的回答是,如果您的项目不仅仅是一个非常简单的项目,那么最好不要将逻辑放在域类中

较长的答案是:

如果您将逻辑放在服务层中,那么您实际上是在遵循服务层,并以服务层结束。这可能是一条有效的路线,但通常在简单和小型项目中效果最好。问题在于,随着事务脚本层(您的服务层)的增长,它的维护变得更加复杂

因此,另一种选择是创建一个包含逻辑的富域模型。将逻辑与其应用的类保持在一起是良好的OO设计的关键部分,在复杂的项目中非常重要。最初它通常需要更多的思考和努力,这就是为什么对于非常简单的项目,人们有时会使用事务脚本模式

如果您不确定要使用哪一个,那么重构您的逻辑以将其从服务层移动到域通常不是一件太困难的工作,但是您需要尽早进行调用,以确保任务不会太大


与其中一个答案相反,使用POCO类并不意味着您的域类中不能有业务逻辑,例如特定于特定ORM的方法和接口。具有应用业务逻辑的某些函数的类显然仍然是一个普通的旧CLR对象

谢谢你,布莱恩。只是为了澄清我给出的示例“CanBeCancelletOnline”可能是在表单上启用/禁用“取消订单”按钮的要求-因此在这种情况下,我确实需要“提取属性并自己做出决定”(我认为这在许多情况下并不违背OO范式)。。。。让我们说(仅举个例子),为了确定订单是否可以取消,它需要了解一些有关客户合同的信息。还有两个选择。a) OrderBusiness类使用来自订单和合同的信息(或逻辑)来确定订单是否可以取消。或者b)我实现order.canbecancelletonline(Contract Contract),并且逻辑仍保留在order类中。我想你会倾向于b)作为最佳方法?如果订单与客户合同相关,那么可能它暗指该合同。所以这是第三种选择(如果有效的话,我更愿意选择)是的,我猜你可能会这么说!但是,如果为了本次讨论,无法从订单对象处获得合同,您是否仍然希望选择b)?是的。绝对地情报仍在订单中。谢谢。我读过关于“贫血领域模型”的文章,这似乎就是你所建议的。我不得不说,这似乎与我的OO背景背道而驰,但我可以理解您希望通过这种方式保持POCO干净的原因。对不起,不应该包含业务逻辑的声明是完全错误的。它们可以而且通常确实包含行为和逻辑,但不应该包含特定于框架的元素,如特定于ORM的基类。你所描述的几乎像是一个DTO:。@Steve-你是100%正确的。回到我很久以前给出的答案上来真有趣。:)