我正在重新评估我们的n层架构,并希望根据您的经验获得一些建议。这是我们典型的.NET n层(有时是n层)设计。
Project.UI
Project.Services
Project.Business
Project.Model
Project.DataAccess
DataAccess通常由Entity Framework 4
和Repository
类组成。我尝试遵循聚合根
的概念,以避免为每个表创建一个存储库,但在我的经验中,这比说起来容易得多。我倾向于在存储库和表之间有约70%的匹配。
模型通常由我的Entity Framework 4
实体组成,我一直在成功地使用Self-Tracking EF实体。
业务是我最困难的部分。我通常为每个存储库拥有一个Manager
类。该类将包含像.Add()这样的方法,在转发到repository.Add()之前执行业务验证。
服务,通常仅在我确实希望创建基于Web服务的解决方案时才实现。该层将负责在DTO和实体之间进行请求/响应处理。最重要的是提供更粗粒度的接口。例如TradingService.SubmitTrade(),它实际上是用于业务交易的facade
,其中可能包括AccountManager.ValidateCash(),OrderManager.SubmitOrder()等。
关注点
我的业务层非常以实体为中心,实际上只是连接实体和存储库的粘合剂,并在两者之间进行验证。我看到过许多设计,其中Service层是持有对存储库的引用(实质上跳过了“业务层”)。它执行验证,但其责任(和命名)是更高级别的、更粗粒度的业务交易。使用上面的例子,TradingService.submitTrade()将不会委托给任何业务管理器类,它本身将查询必要的存储库,执行所有验证等。
我喜欢我的设计,因为我可以在多个服务调用中重用业务层方法,但我讨厌每个存储库都有一个匹配的业务层管理器,这会创建大量额外的工作。也许解决方案是在业务层级别上采用不同类型的分组?例如,将像PhoneManager和EmailManager(注意我有Phone实体和Email实体)这样的单独的Manager类合并到一个逻辑Manager类中,例如ContactsManager(注意我没有“Contact”实体类型)。具有诸如ContactManager.GetPhones()和ContactManager.GetEmail()等方法。
我想更多地了解其他人如何组织和委派职责,无论他们是否拥有Service层、Business层、两者都有等。什么持有ORM上下文引用等。