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

Mic*_*urn 5 c# database design-patterns

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

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

我们的层次结构如下所示:Common> Model> DAL> BAL

这里有关于层级的更多细节.请记住,我继承了以下内容:Common负责所有"实用程序"函数,这些函数在应用程序中的许多位置使用,例如访问配置设置,解析字符串,非业务相关功能.

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

DAL是数据访问层,理论上,这里发生的所有事情都是模型对象被移入和移出数据库.

BAL是业务层; 理论上,强制执行管理对象交互的业务规则(即"表单必须至少包含两个项目".).

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

有没有其他人处理过一个业务对象,其目的是与数据库进行交互,以及如何将其置于您的N层架构中?

在你告诉我使用Linq to Sql之前,非常感谢.这不是一个技术问题(我该怎么做),这是一个设计问题(我该怎么做).

我认为StackExchange站点更侧重于这些与语言无关的设计问题,因此我将在那里复制它.

Mic*_*urn 0

感谢大家的意见,这里有一些我计划实施的改进想法,尽管没有一个直接回答我提出的问题。

我将其交叉发布给程序员,我认为这类问题可能真正属于该问题,并得到了一些有用的想法。如果您有兴趣,该主题位于此处: 关于此问题的程序员主题。诚然,我在发帖时根据自己的研究添加了依赖注入的“提示”,所以问题可能更清楚了。

这是一个伟大且乐于助人的社区,我很自豪能够参与其中。