我试图重新评估我们的n层结构,很想得到根据您的经验提出了一些建议。这是我们典型的.NET n层(有时是n层)设计。n层业务/服务层设计
Project.UI
Project.Services
Project.Business
Project.Model
Project.DataAccess
数据访问通常由Entity Framework 4
和Repository
类。我试图遵循Aggregate Root
的概念,以避免拥有一个表格存储库,在我的经验中说起来容易。我倾向于在储存库和表格之间有〜70%的匹配。
模型通常由我Entity Framework 4
实体的,我一直在使用自追踪EF实体成功。
业务是什么,我挣扎之最。我通常每Repository
有一个Manager
类。这个类将包含像.Add()这样的方法,它将在转发到repository.Add()之前执行业务验证。
服务,通常我只会实现这个如果事实上我期待建立一个基于Web服务的解决方案。这一层将负责封送DTO和实体之间的请求/响应。最重要的是提供更多的coarse grained
接口。例如一个TradingService.SubmitTrade(),这实在是一个facade
用于商业交易可能包括AccountManager.ValidateCash(),OrderManager.SubmitOrder()等
参与讨论
我的业务层是非常实体以实体为中心,实际上它只是实体和存储库之间的粘合剂,两者之间进行了验证。我见过很多设计,其中服务层是对存储库的引用(实质上跳过“业务层”)。实质上,它与我的业务层具有相同的用途,但是它的确是有效的,但是它的责任(和命名)是一个更高层次,更粗糙的业务事务处理。使用上面的示例TradingService.submitTrade()不会委托给任何业务经理类,它本身将查询必要的存储库,执行所有验证等。
我喜欢我的设计,因为我可以重用业务但是我讨厌这样一个事实:对于每个存储库,我都有一个匹配的业务层管理器,从而创建大量额外的工作。也许该解决方案是业务层级别的不同类型的分组?例如,将诸如PhoneManager和EmailManager(注意我拥有电话实体和电子邮件实体)的单独管理器类合并到ContactsManager等逻辑管理器类(请注意,我没有“联系人”实体类型)。使用诸如ContactManager.GetPhones()和ContactManager.GetEmail()等方法。
我想比其他任何我想知道其他人如何组织和委派职责,无论他们有服务层,业务层,两者等什么持有ORM上下文引用等
您是否曾经有跨多个业务经理类的服务调用?换句话说,您的服务界面可能比业务经理更粗糙。例如ContactService.CreateUser(),将委托给UserManager.CreateUser()和ContactManager.AddEmail()以及ContactManager.AddPhone()等等。同样,即使我们将电子邮件和电话相关的逻辑分组到ContactsManager中,有PhoneRepository和EmailRepository没有错。在我看来,存储库不像管理者那样是“逻辑的”。 – e36M3 2011-01-26 17:44:19