洋葱拱门依赖在同一层:基础设施和networking通信
我正在devise一个使用Jeffrey Palermo描述的洋葱架构的ASP.NET MVC应用程序。
这是一个ASP.NET MVC 2.0项目,我要求所有视图都使用专用视图模型进行强types化 – 我们不会将域模型传递给我们的视图。 我们使用AutoMapper进行翻译 – AutoMapper被隔离在基础架构中,Web不知道或在意使用AutoMapper。
目前,我正在Web项目中定义IViewModelMapping接口 – 仅仅因为这个服务将被控制器使用,并且可以直接访问它自己的视图模型。 这样接口就可以访问域模型(核心)和视图模型(networking)。
为了提供IViewModelMapping接口的实际实现,我在基础结构项目中创build了一个ObjectMapping命名空间,将实际的映射实现隔离到洋葱的基础设施。 在这样做的时候,这将需要基础架构依赖于核心和networking。
我的问题是:因为这两个项目在技术上都位于洋葱的郊区(在同一层) – 一个项目是否允许依赖于该层中的另一个项目? 有没有人注意到这个devise的任何潜在的陷阱?
另一种devise是将IViewMapper接口移动到Core中,但这是不可能的,因为Core无法访问ViewModel类。 我也可以将视图模型移动到Core中,但是我觉得他们不属于那里,因为它们是特定于UI层的。
所提出的体系结构如下所示 – 注意到,基础架构依赖于Core和Web。 Web仍然是孤立的,只能访问Core业务逻辑。
http://www.matthidinger.comhttp://img.dovov.comonion-arch.png
你不错,你不希望基础设施依赖UI(networking),但我有时打破这个规则。
我会想,而不是IViewModelMapping,与方法Map()创buildIMapper。 然后,接口可能有实现可能与视图模型映射,或者可能只是定期映射。 无论哪种方式,该接口可以在核心,因为它没有语义绑定到任何types的模型。
伟大的graphics。 我希望我回答你的问题。 洋葱体系结构的整体理念是将您的业务逻辑和模型保持在应用程序的中间(核心),并尽可能向外推动您的依赖关系。
尝试将对象映射移动到Web层。
您的Web / UI层可以依赖于基础架构层。 但是在基础架构层上依赖Web是不太好的devise。 洋葱build筑说尽可能远离你的依赖。
你可以在UI中创build一个“\ Builder”文件夹。 在其中添加一个接口文件,例如:IBuilder或IMapper,并在其中声明一个类似ConvertToViewModel或CreateMapping的方法。 随你喜欢。
* Builder ** IBuilder.cs – 在这里声明一个方法。 ** Builder.cs – 在这里实现这个方法,定义一个ViewModel和它相应的DomainModel(核心层的引用)之间的映射,并在这里返回适当的ViewModel。