14 .net c# architecture asp.net domain-driven-design
我正在设计N层应用程序,我遇到了一个你可能有解决方案的难题.表示层是MVC.
我的ORM是使用LinqToSQL执行的 - 它是一个独立的项目,为存储库提供服务.
每个reporsitory都有一个接口和至少1个具体实现.
存储库具有以下方法: FindAll(), Save(T entity), Delete(int id)
FindAll() 返回某种类型的IQueryable,这意味着它返回我可以应用过滤器的查询.
ORM映射已使用Database First方法执行,其中首先创建表,然后由SQL Metal生成类.
我添加了一个与存储库一起使用的Pipeline图层.它将更多过滤器应用于查询.例如OrderRepository.FindAll().Where(o => o.CustomerId == 10)
Pipeline还返回某种类型的IQueryable,这意味着我可以将它传递到图层的更多内容并用它做更多的东西.
此时我想转移到BusinessLogic层,但我不想再使用实体模型了,我想将实体模型转换为域模型.这意味着我可以向模型添加验证并在表示层中使用该模型.模型不能在MVC项目中定义,因为它依赖于表示层,所以这是一个否定.
我很确定业务逻辑(行为)和模型必须与管道,数据和表示层分开存储.问题是在哪里?
例如,管道有三种方法:1.FindByCustomerId 2. FindByOrderId 3. FindBySomethingElse
所有这些方法都返回了IQueryable of Order.我需要将其转换为域模型,但我不希望每个方法都这样做,因为它不可能是主要的.
我觉得这个模型非常强大且可扩展.我只是没有看到从实体映射到域模型的最佳位置,反之亦然.
谢谢
xel*_*ion 13
首先,如果您在此处应用域驱动设计原则,则不得在应用程序中使用BusinessLogic层.所有业务逻辑都应该存在于您的域模型中.
但是使用LinqToSQL很难实现,因为它不支持继承映射,你必须处理部分类以将业务逻辑放入你的域.所以我强烈建议考虑从LinqToSQL迁移到NHibernate或Entity Framework Code First.在这种情况下,您也不必将持久性模型转换为域模型,反之亦然.
如果您仍想进行转换,可以查看Automapper
the*_*kip 12
从域驱动的角度来看,您需要工厂将"数据库实体"转换为域模型实体.
当您考虑将"数据库实体"转换为管道末端的域模型实体时,您应该意识到在转换为域模型实体(投影)之后,您将无法使用IQueryable功能作为投影将触发表达式树的执行.例如,如果您为客户数据库实体调用FindAll,然后将IQueryable转换为(或将其投影到)客户域实体,它将执行(请求整个表的内容).
这就是我进行N-Tier项目的方式.这种架构具有很大的关注点.听起来你已经走向了这个方向.
在Mvc项目中是所有常用对象(控制器,ViewModel,视图,帮助器等).非常坦率的.所有视图都是强类型的.加上我修改过的T4模板,可以生成Controllers,Views和ViewModels.
在业务模型项目中,我拥有所有业务对象和规则,包括定义数据存储库功能的接口.我没有为每个业务对象/表创建一个存储库,而是希望按功能对其进行分组.与博客相关的所有对象都在一个存储库中,而与照片库相关的所有对象都在一个单独的存储库中,并且日志记录可能在第三个存储库中.
您可以在此处放置管道图层.
在Data项目中,我实现了那些数据存储库接口.您可以使用Linq2SQL而无需使用部分类.扩展那些Linq2SQL分部类意味着您已将ORM绑定到域模型.你真的不想做的事情.您希望将这些生成的数据类保留在数据域中.以下是返回BusinessModel对象的Linq2SQL select示例.
from t in Table
where t.Field == keyField
select new BusinessModel.DataObject
{
Id = t.Id,
Field1 = t.Field1,
Field2 = t.Field2
}
Run Code Online (Sandbox Code Playgroud)
如果我是你,我会使用CodeFirst方法查看EntityFramework 4.1或使用NHibernate.这些中的任何一个都会将您的数据模型映射到域模型.然后,将域模型映射到视图模型,您可以使用AutoMapper或编写自定义代码或编写将为您生成映射代码的T4模板.
您可以将dbml文件生成的代码作为业务对象的起点.
| 归档时间: |
|
| 查看次数: |
1718 次 |
| 最近记录: |