【发布时间】:2011-03-30 16:50:22
【问题描述】:
我正在向我们的网站添加功能,该功能使用 MSMQ 异步执行长时间运行的进程。然而,这样做意味着我们需要在用户的请求完成时通知他们。使用命令模式,我创建了一个名为 INotify 的接口*,并将其组合到消息类中,因此消息处理类可以简单地在消息的 INotify 对象上调用 GiveNotice()。第一个实现,EmailNotify,比预期的要困难,因为我惊讶地发现 MailMessage 不是可序列化的,但它成功了。
现在我正在开发一个新的具体通知程序 DBNotify,它将调用某种 SP 并更新主事务数据库中的状态。我很想重用我们已经创建的 DAL 架构,但 INotify 是 Model 项目的成员,它比 DAL 更基础。
我们的层次结构如下所示: Common > 模型 > DAL > BAL
这里有更多关于层的详细信息。请记住,我继承了这个: Common 负责应用程序中许多地方使用的所有“实用”功能,例如访问配置设置、解析字符串、非业务相关功能。
模型是业务对象,有些人称之为数据传输对象,getter 和 setter 的集合。我在这一层添加了一些“智能”,但仅限于该对象内部的业务规则,例如“项目名称必须以字母数字字符开头。”
DAL 是数据访问层,理论上,这里发生的只是模型对象被移入和移出数据库。
BAL 是业务层;理论上,管理对象交互的业务规则是强制执行的(即“一个表单必须至少有两个项目。”)。
因此,INotify 接口被定义为一个抽象,以允许通知方法独立变化(即电子邮件、TXT、twitter 等)。它是系统的基础,所以我在模型层创建了它,它独立于 DAL 层。但是,我正在创建 INotify 的新具体实现,其通知方法是调用数据库中的 SP。
是否有其他人处理过以与数据库交互为目的的业务对象,您如何将其置于 N 层架构中?
在您告诉我使用 Linq to Sql 之前,非常感谢。这不是技术问题(我该怎么做),而是设计问题(我应该怎么做)。
我认为有一个 StackExchange 网站更专注于这类与语言无关的设计问题,所以我将把它复制到那里。
【问题讨论】:
-
* 只是名义上的接口,因为我真的想序列化这些对象,所以我不得不把它变成一个抽象类。
-
我对你的层次结构感到困惑。模型和 BAL 负责什么?我用 BAL 代表业务访问层,但后来模型似乎不合适。在我看到的代码中,模型通常是最抽象的,位于(使用)之上或者是业务层的一部分......另外,如果模型比 DAL 更基础,那么 DAL 使用类有什么问题从和调用模型上的方法?
-
哦,如果你不知道,你不需要在cmets中添加信息,你可以简单地编辑你的问题......
标签: c# database design-patterns