我正在设计N层应用程序,遇到了一些困难,您可能有解决方案。演示层是MVC。
我的ORM使用LinqToSQL进行,这是一个独立的项目,用于提供存储库。
每个存储库都有一个接口和至少一个具体实现。
存储库具有以下方法:FindAll(),Save(T entity),Delete(int id)
FindAll()返回某种类型的IQueryable,这意味着它返回查询,可以对其应用过滤器。
使用先创建表,然后通过SQL Metal生成类的“数据库优先”方法进行ORM映射。
我添加了一个Pipeline层来处理存储库。它将进一步过滤查询。例如:OrderRepository.FindAll()。Where(o => o.CustomerId == 10)
Pipeline还返回某种类型的IQueryable,这意味着我可以将其传递到更高的层并使用更多功能。
此时,我想转移到BusinessLogic层,但我不想再使用实体模型,我想将实体模型转换为域模型。这意味着我可以向模型添加验证并在演示层中使用该模型。不能在MVC项目中定义模型,因为它将依赖于演示层,所以不行。
我相当确定业务逻辑(行为)和模型必须与管道、数据和演示层分别存储。问题是在哪里?
例如,管道有三个方法: 1. FindByCustomerId 2. FindByOrderId 3. FindBySomethingElse 所有这些方法都返回Order的IQueryable。我需要将其转换为域模型,但我不想每个方法都这样做,因为它将无法维护。
我觉得这个模型相当强大和可扩展。我只是看不到从实体到域模型的最佳映射位置。
谢谢。
我的ORM使用LinqToSQL进行,这是一个独立的项目,用于提供存储库。
每个存储库都有一个接口和至少一个具体实现。
存储库具有以下方法:FindAll(),Save(T entity),Delete(int id)
FindAll()返回某种类型的IQueryable,这意味着它返回查询,可以对其应用过滤器。
使用先创建表,然后通过SQL Metal生成类的“数据库优先”方法进行ORM映射。
我添加了一个Pipeline层来处理存储库。它将进一步过滤查询。例如:OrderRepository.FindAll()。Where(o => o.CustomerId == 10)
Pipeline还返回某种类型的IQueryable,这意味着我可以将其传递到更高的层并使用更多功能。
此时,我想转移到BusinessLogic层,但我不想再使用实体模型,我想将实体模型转换为域模型。这意味着我可以向模型添加验证并在演示层中使用该模型。不能在MVC项目中定义模型,因为它将依赖于演示层,所以不行。
我相当确定业务逻辑(行为)和模型必须与管道、数据和演示层分别存储。问题是在哪里?
例如,管道有三个方法: 1. FindByCustomerId 2. FindByOrderId 3. FindBySomethingElse 所有这些方法都返回Order的IQueryable。我需要将其转换为域模型,但我不想每个方法都这样做,因为它将无法维护。
我觉得这个模型相当强大和可扩展。我只是看不到从实体到域模型的最佳映射位置。
谢谢。
INotificationService
,领域模型不应该知道此类事情,我认为Fowler在领域逻辑和应用程序逻辑之间作出了区分,并建议第二个应该驻留在服务层 - 以这种方式,领域模型和服务层可以很好地协作。 - mnemosyn