我不能说在任何情况下都是绝对正确的(因为什么都不是,但也因为我不是一个真正的“企业”-y 开发人员),但是......
- 数据库/实体操作,例如插入和更新,通常由封装每个数据库操作的 Repository 类处理。存储库方法接受或返回表示数据库记录(或记录,如果您有良好的 ORM)的实体类对象。实体对象应该是 POCO 并且不包含将自身直接绑定到数据库的逻辑 - 这允许您将默认存储库实现替换为模拟,这使得测试变得更加容易。
- 请注意,在 .NET 世界中,您的 EF
DbContext
已经是一个存储库。您不需要自己重新实现存储库模式。
- 仅对实体对象的内存状态进行操作的访问器和修改器。这包括琐碎的属性,但也包括诸如
Person.GetFullName()
连接Person.FirstName
和Person.LastName
字段之类的东西。
- 所以你不会在你的
Person
类上调用一个方法,SendEmailTo()
因为这不是对 Person 的真正操作,而是在你的电子邮件系统上的操作。
- 一般来说,没有。您的业务逻辑应该响应传入的消息(例如客户端事件或轮询计时器)而发生,并且与单纯的存储库任务分开关注。
以下是我如何实现一个简单的 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 层中做所有事情”的方法可以正常工作,但是规范中有很多小问题的“企业”应用程序将需要这些额外的层。