【发布时间】:2011-08-29 18:44:10
【问题描述】:
我正在设计 N 层应用程序,遇到了一个您可能有解决方案的难题。表示层是 MVC。
我的 ORM 是使用 LinqToSQL 执行的 - 它是一个单独的项目,为存储库提供服务。
每个存储库都有一个接口和至少 1 个具体实现。
存储库有以下方法:FindAll(), Save(T entity), Delete(int id)
FindAll() 返回某种类型的 IQueryable,这意味着它返回我可以应用过滤器的查询。
ORM 映射是使用 Database First 方法进行的,其中首先创建表,然后由 SQL Metal 生成类。
我添加了一个与存储库一起使用的管道层。它将进一步的过滤器应用于查询。例如。 OrderRepository.FindAll().Where(o => o.CustomerId == 10)
Pipeline 还返回某种类型的 IQueryable,这意味着我可以将它向上传递到层并用它做更多的事情。
此时我想移动到业务逻辑层,但我不想再使用实体模型,我想将实体模型转换为领域模型。这意味着我可以向模型添加验证并在表示层中使用该模型。模型不能在 MVC 项目中定义,因为它依赖于表示层,所以不能。
我相当肯定业务逻辑(行为)和模型必须与管道、数据和表示层分开存储。问题是在哪里?
例如,管道具有三种方法: 1. FindByCustomerId 2. FindByOrderId 3. FindBySomethingElse
所有这些方法都返回 IQueryable of Order。我需要将其转换为域模型,但我不想按每种方法都这样做,因为它无法维护。
我觉得这个模型相当健壮且可扩展。我只是不知道从实体映射到域模型的最佳位置是什么,反之亦然。
谢谢
【问题讨论】:
标签: c# .net asp.net architecture domain-driven-design