Architecture MVVM、业务逻辑、实体、DTO';然后把它们绑在一起
我正在做一个新项目,一直在思考我的应用程序的结构 规格:Architecture MVVM、业务逻辑、实体、DTO';然后把它们绑在一起,architecture,mvvm,data-access-layer,dto,business-logic,Architecture,Mvvm,Data Access Layer,Dto,Business Logic,我正在做一个新项目,一直在思考我的应用程序的结构 规格: 多个可能的客户端(至少是一个基于WPF的桌面) 应用程序) 将(至少部分)公开的业务逻辑 第三方 数据访问和实体将使用LLBLGen Pro V3生成 关于如何处理这些(或相关)问题,有很多问题。到处捡拾零碎的东西,我来了: 一个单独的DAL,包括所有生成的实体 BLL 在上面的一个瘦WCF服务将所述实体转换为DTO(例如使用Automapper) 使用MVVM的基于WPF的客户端 还有一些思考: 所有实体都位于DAL中,并且只有
- 多个可能的客户端(至少是一个基于WPF的桌面) 应用程序)
- 将(至少部分)公开的业务逻辑 第三方
- 数据访问和实体将使用LLBLGen Pro V3生成
- 一个单独的DAL,包括所有生成的实体
- BLL
- 在上面的一个瘦WCF服务将所述实体转换为DTO(例如使用Automapper)
- 使用MVVM的基于WPF的客户端
问题:这是一个好方法吗?因为这感觉有点像过度工程化的东西,我已经在将我的数据库模型映射到实体,那些实体映射到DTO,那些映射到ViewModels,感觉这是一个很大的开销。有趣的是,这个问题就在“体系结构”的“活动”组中的标签是,它似乎比这一个有更多的关注,尽管非常相似 无论如何,这并不是特别针对.Net/WCF/WPF,而是取决于您所追求的灵活性(或您的需求要求)。对我来说,你所做的没有什么错,而且总体而言,这是最聪明的方法,因为它使你从僵硬的数据存储中解放出来 请记住,如果您允许外部系统连接到您的系统(例如,通过web API),则绝对不应公开DAL。甚至BLL也应该被包装在一个薄层中,这样您就可以抽象出传输层的特定需求(这是WCF试图实现的,但如果您在特定的传输通道上有特殊的业务逻辑—API密钥等,则可能还不够) 最大的好处是能够根据所调用的服务定制DTO。举个例子,看看LinkedIn的web API。它们允许客户机在任何给定时间“请求”它想要的数据,并构建数据集的特定视图,以适应其需要,从而减少带宽使用(对于每个API服务,客户机不接收整个数据集,只接收它请求的特定视图)。这是一个web示例,但设计模式也可以应用于胖客户机
关于性能,将实体转换为DTO以查看对象时肯定会有影响。但首先检查系统的性能是否不受其他因素(数据库、内存、线程等)的限制。DTO选项甚至可能更快,这取决于您构建服务的方式,因为通过网络发送的信息可能要少得多。可能更重要的是仔细设计BLL,以便将实体到数据到实体的对话考虑在内。这同样适用于系统中的其他每一层(从服务到表示,等等) 也许我不应该在早上5点发布:-)我从其他一些问题中得出的结论是,有些人更喜欢使用POCO,因为他们有状态和行为。我使用LLBLGen为我生成模型。它们在生成的部分(包含所有属性和其他属性)和行为所在的部分类中被拆分。这不是POCO的基本概念吗?因此,DTO位于其之上,用作BLL的输入和输出。我一直在阅读有关贫血模型的文章,但如果您只有DTO,并且有外部部分负责行为,则情况似乎是这样。行为可以进入您的领域模型,并且可能应该(请参阅)。它不应该暴露于表示层,因为它通常不适合网络传输和表示(大量转换/验证等)。这一切都取决于您的系统,因此请针对解决方案的开发时间/(轻微)性能下降检查灵活性/松耦合参数。