1

我在每个项目中的基本解决方案结构是:

  • Dal - 数据访问层
  • 业务逻辑分为两部分,一是业务实体,二是业务逻辑

因此,在我目前的实践中,我的实体仅包括数据成员和属性,而不包括 CRUD 操作。将 CRUD 操作放在 Entity 中总是感觉不对。我的想法是..

  • 哪个实体删除自己没关系?
  • 哪个实体将自己添加到数据库中没关系?

因此,我将 CRUD 操作移至另一个代表我的业务逻辑的库(类)。

例如,假设我们有一个 foo 实体

public class Foo
{
    //Data Members
    private int _id;
    private string _Name;

    //Properties
    public int ID { get; set; }
    public string Name { get; set; }
}

因此,对于这个实体,我将创建一个包含所有 CRUD 操作的 FooLogic 库(类),例如:

  • 添加新实体
  • 删除实体
  • 获取实体列表
  • 更新实体等等..

所以我要问的是:

  1. 不将 CRUD 操作放在实体对象中是正确的做法吗?
  2. 如果是这样,我当然应该在“打印详细信息”旁边放入实体自己的哪些方法
  3. 每个重要实体都有业务逻辑库(类)可以吗?
4

2 回答 2

3

我不能说在任何情况下都是绝对正确的(因为什么都不是,但也因为我不是一个真正的“企业”-y 开发人员),但是......

  1. 数据库/实体操作,例如插入和更新,通常由封装每个数据库操作的 Repository 类处理。存储库方法接受或返回表示数据库记录(或记录,如果您有良好的 ORM)的实体类对象。实体对象应该是 POCO 并且不包含将自身直接绑定到数据库的逻辑 - 这允许您将默认存储库实现替换为模拟,这使得测试变得更加容易。
    • 请注意,在 .NET 世界中,您的 EFDbContext已经是一个存储库。您不需要自己重新实现存储库模式。
  2. 仅对实体对象的内存状态进行操作的访问器和修改器。这包括琐碎的属性,但也包括诸如Person.GetFullName()连接Person.FirstNamePerson.LastName字段之类的东西。
    • 所以你不会在你的Person类上调用一个方法,SendEmailTo()因为这不是对 Person 的真正操作,而是在你的电子邮件系统上的操作。
  3. 一般来说,没有。您的业​​务逻辑应该响应传入的消息(例如客户端事件或轮询计时器)而发生,并且与单纯的存储库任务分开关注。

以下是我如何实现一个简单的 CRM(使用单个实体Customer):

一个实体类DBCustomer

(可能由实体框架生成)表示存储在数据库中的客户。

class DBCustomer {
    public String FirstName { get; set; }
    public String LastName  { get; set; }
    public String FullName  { get { return this.FirstName + " " + this.LastName; } }
}

一个存储库

实体框架DbContext是您的存储库对象,因此无需在此处完成任何工作。

商业逻辑

...例如 WCF 消息处理程序 - 但有时逻辑非常简单,尤其是当业务操作直接对应于数据库操作时,例如

StatusCode Customer_Add(CustomerXml newCustomerXml) {
    DBCustomer newCustomer = createNewCustomerFromXmlMessage( newCustomerXml );

    using( MyDbContext dbc = CreateDbContext() ) {
        dbc.Customers.Add( newCustomer );
        dbc.SaveChanges();
    }

    return StatusCode.Success;
}

现在您可能会注意到这里似乎有很多无用的层 - 我可以使用 CustomerXml 类(它表示反序列化的以前 XML 格式的消息),然后直接从 WCF 消息事件处理程序调用 EF 上下文方法,并且它适用于非常琐碎的项目,但是随着项目的增长,您会发现您需要在每一步添加自定义逻辑,突然间事情变得无法管理。

因此,对于一个简单的数据驱动网站,一个简单的“在 ame 层中做所有事情”的方法可以正常工作,但是规范中有很多小问题的“企业”应用程序将需要这些额外的层。

于 2012-09-23T07:43:00.457 回答
1

关于 1,2 - 在对象持久性工具和 ORM 中有两种不同的常用方法,ActiveRecord 模式和 Repository 或 DataAdapter 模式。ActiveRecord 是将 CRUD 和其他一些操作放在实体对象中的一种,存储库模式将实体(DTO)与这些操作中的操作分开。
Active Record 模式有它自己的优势(据说更容易),但我更喜欢 Repository,因为它更灵活且可测试。

3-为每个实体创建一个项目有什么好处,我认为这不是一个好主意。

于 2012-09-23T08:21:49.703 回答