我的项目分层如下:
DAL(实体)
--> BLL(DTO)
--> ApplicationComponent(ViewModel)
。
应用程序的多个组件(ApplicationComponent
)将访问BLL
。组件包括Windows服务、Web服务、Web API和MVC控制器。
我正在将NHibernate
Entity
对象转换为DTO
对象,同时将它们从DAL
传递到BLL
。在将此状态传递给ApplicationComponent
时,BLL
再将其转换为ViewModel
。
这有助于我将关注点分离,并了解每个层中数据的处理方式。出于以下原因,我不赞成将NHibernate
Entity
对象返回到视图:
- 数据暴露给
UI
,我想隐藏它(或仅在需要时公开),如密码、用户类型、权限等。 - 在引用/连接上,
NHibernate
在访问属性时执行附加查询,这使得延迟加载的使用无效。 - 向用户(
Entity
的用户)公开不必要的数据会导致混淆和漏洞。 - 持久性实现泄漏到
BLL
/UI
。Entity
没有为UI
设计。它不能在所有情况下为UI
提供服务。 - 我们在
DTO
属性上使用属性进行用户输入验证,这在Entity
中看起来很奇怪。
我遇到了以下问题:
- 最大和明显的问题是具有类似成员和功能的冗余对象。
- 我必须在每个层中编写映射器方法以转换对象。这可以通过使用
AutoMapper
或类似工具来最小化,但它并不能完全解决问题。
问题:
- 这是一种过度分离,应该避免(至少尽量减少)吗?
- 如果这种方法是正确的,我没有看到任何简单的方法来完全规避我上面提到的两个问题。请给出建议。
- 如果这种方法是不正确的,请给出纠正意见。