洋葱体系结构的依赖性在同一层:基础设施和网络通信
-
22-09-2019 - |
题
我设计使用洋葱结构由Jeffrey巴勒莫说明。
这是一个ASP.NET MVC 2.0项目中,我要求所有的视图中使用专用的视图模型是强类型的 - 我们不会通过域模型对我们的看法。我们使用AutoMapper做翻译 - AutoMapper是在基础设施隔离,网络不知道或不关心正在使用AutoMapper
目前,我定义的IViewModelMapping接口的Web项目 - 仅仅是因为该服务将通过控制器一起使用,它有它自己的视图模型的直接访问。这样的接口可以同时访问域模型(核心)和视图模型(网络)。
为了提供对实际执行的IViewModelMapping接口的,我在基础设施项目,这将实际的映射实现隔离到洋葱的Intrastructure创建的ObjectMapping命名空间。这样一来,这需要基础设施,以对核心和网络的依赖。
我的问题是:因为这两个项目在技术上对洋葱的郊区(在同一层) - 是一个项目允许对在该层其他项目的依赖?没有任何人通知的任何潜在的缺陷这样的设计?
这是替代设计将是IViewMapper接口移动到核心 - 但这将是不可能的,因为核心不具有访问该视图模型类。我也可以移动视图模型为核心,但我觉得他们不会属于那里,因为它们是特定于UI层。
所提出的体系结构如下: - 通知该基础设施对核心和Web的依赖性。幅遗体分离并仅有权访问核心业务逻辑。
解决方案
您是正确的,你不想基础设施依赖于UI(网页),但我有时会打破这个规则。
我反而认为IViewModelMapping的,创建方法地图IMapper()。然后,该接口可以有可能与视图模型映射,或者只是普通的映射做的实现。无论哪种方式,该接口可以是核心,因为它不是语义上束缚于任何类型的模型。
大的图形。我希望我回答你的问题的肉。洋葱结构的总体理念是保持业务逻辑和模型在应用程序的中间(核心)和推动你的依赖性远向外越好。
其他提示
尝试移动的对象映射强>到网络强>层。
您的Web / UI层可取决于基础设施层上。但它不是一个好的设计有基础设施层上网络的依赖。洋葱建筑说把你的依赖就向外越好。
您可以创建在用户界面中“\制作工具”文件夹中。添加一个接口文件中它,例如.. IBuilder或IMapper和在它宣布像ConvertToViewModel或CreateMapping的方法。无论你喜欢。
*生成器 ** IBuilder.cs这里-declare的方法。 ** Builder.cs - - 这里实施的方法中,一个ViewModel之间限定映射和它的相应的DomainModel(从核心层参考)和这里返回适当视图模型。