Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.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# 在N层体系结构中实现数据库功能对象?_C#_Database_Design Patterns - Fatal编程技术网

C# 在N层体系结构中实现数据库功能对象?

C# 在N层体系结构中实现数据库功能对象?,c#,database,design-patterns,C#,Database,Design Patterns,我正在向我们的网站添加功能,该网站使用MSMQ异步执行长时间运行的流程。然而,这样做意味着我们需要在用户的请求完成时通知用户。使用命令模式,我创建了一个名为INotify的接口*,并将其组合到消息类中,因此消息处理类可以简单地调用消息的INotify对象上的GiveNotice()。第一个实现,EmailNotify,比预期的要困难,因为我惊讶地发现MailMessage不可序列化,但它已经启动了 现在我正在开发一个新的具体通知程序DBNotify,它将调用某种SP并更新主事务数据库中的状态。我

我正在向我们的网站添加功能,该网站使用MSMQ异步执行长时间运行的流程。然而,这样做意味着我们需要在用户的请求完成时通知用户。使用命令模式,我创建了一个名为INotify的接口*,并将其组合到消息类中,因此消息处理类可以简单地调用消息的INotify对象上的GiveNotice()。第一个实现,EmailNotify,比预期的要困难,因为我惊讶地发现MailMessage不可序列化,但它已经启动了

现在我正在开发一个新的具体通知程序DBNotify,它将调用某种SP并更新主事务数据库中的状态。我被绊倒了,因为我想重用我们已经创建的DAL体系结构,但INotify是模型项目的一员,这比DAL更基本

我们的层次结构如下所示: 通用>模型>DAL>BAL

下面是有关分层的更多详细信息。请记住,我从以下方面继承了这一点: Common负责应用程序中许多地方使用的所有“实用程序”功能,如访问配置设置、解析字符串、非业务相关功能

模型是业务对象,一些人称之为数据传输对象,是getter和setter的集合。我在这一层添加了一些“smarts”,但只有该对象内部的业务规则,例如“项目名称必须以字母数字字符开头”

DAL是数据访问层,理论上,这里所发生的一切就是将模型对象移入和移出数据库

BAL是业务层;理论上,管理对象交互的业务规则是强制执行的(即“一个表单必须至少有两个项”)

因此,INotify接口被定义为一个抽象,以允许通知方法独立变化(即电子邮件、TXT、twitter等)。它是系统的基础,所以我在模型层创建了它,它独立于DAL层。但是,我正在创建INotify的一个新的具体实现,其通知方法是调用数据库中的SP

是否有其他人处理过一个业务对象,其目的是与数据库交互,您如何在N层体系结构中定位它

在您告诉我使用LINQtoSQL之前,非常感谢。这不是一个技术问题(我该怎么做),而是一个设计问题(我该怎么做)


我认为有一个StackExchange网站更关注于这些与语言无关的设计问题,所以我将把它复制到那里。

如果您的模型类是DTO(有些人可能称之为数据结构或数据类型),那么它们应该(可能)覆盖您的其他层,并为所有人所知


根据您所说的,您可能有一个MessageProcessing类,它位于BAL中,从BAL或DAL的其他部分接收消息,然后通知正在侦听的任何人(UI或BAL的其他感兴趣的成员).

仅仅因为您的
INotify
接口在您的模型层中,并不意味着所有的具体实现都需要在那里。它应该是一个接口——接口的目的是实现抽象——而不是基类——基类的目的是实现共享功能。因此,在任何层中具有此类型的属性或参数的任何位置,都应将其声明为INotify。在BAL(您是指BLL,业务逻辑层吗?)中,您将决定INotify实例使用的具体类型。根据通知的复杂程度,您可以在BLL中定义具体的实现,并让它在DAL中使用帮助器类来实际执行对存储过程的调用,或者您可以直接在DAL中将其定义为类,因为它与数据库交互;这实际上是一个基于班级负责程度的判断;无论哪种方式,它都应该可以在顶层访问

是否有其他人处理过一个业务对象,其目的是与数据库交互,您如何在N层体系结构中定位它

从项目的结构来看,每一层的逻辑责任似乎是:

通用: 不依赖于项目中任何其他内容的共享实用程序方法
型号: 定义系统中实体的结构,也称为DTO或数据传输对象,这意味着它们可以在层之间传输。他们所做的只是存储数据并执行基本验证。
DAL: 负责从模型层创建类的实例,并根据存储在存储库(如数据库)中的值设置属性。还负责跟踪对模型实体的更改,并将这些更改保存(持久化)回存储库。
BAL/BLL: 使用在其他层中定义的类来实现有用的功能,并验证是否遵循了业务需求

您可以使用多种技术来实现这一点,即使使用相同的技术,您的具体实现也会因您的工作方式而异。像Linq2Sql或实体框架这样的东西会模糊模型和DAL之间的界限;他们希望在同一个项目中定义这两个。然而,实体框架更灵活,通过一些工作,您可以将实体模型的定义和“上下文”(使用实体框架术语)拆分为单独的项目,后者最终负责DAL组件。您可以编辑T4模板,也可以在线查找将从实体模型生成实体和上下文类定义的模板,以支持存储库和工作单元设计模式,在这些模式中,您从不直接引用实体上下文,而是让它在
+---+   +-------------+
| C |<--| Data Access |<--------------------------+
| o |   +-------------+                           |
| m |         |                                   |
| m |         |                                   |
| o |         v                                   |
| n |   +-------------+   +----------------+   +-----+
|   |<--| Model       +<--| Cross class    |<--| GUI |
|   |   +-------------+   | business rules |   |     |
|   |                     |                |   |     |
|   |<--------------------|                |   |     |
|   |                     +----------------+   |     |
|   |                                          |     |
|   |<-----------------------------------------|     |
+---+                                          +-----+
        +--------------------------------------------+
  +-----| Cross cutting concerns                     |
  |     +--------------------------------------------+
  v           v^                                    ^
+---+   +-------------+                             |
| C |<--| Data Access |<--------------------------+ |
| o |   +-------------+                           | |
| m |         |                                   | |
| m |         |                                   | |
| o |         v                                   | v
| n |   +-------------+   +----------------+   +-----+
|   |<--| Model       +<--| Cross class    |<--| GUI |
|   |   +-------------+   | business rules |   |     |
|   |                     |                |   |     |
|   |<--------------------|                |   |     |
|   |                     +----------------+   |     |
|   |                                          |     |
|   |<-----------------------------------------|     |
+---+                                          +-----+