我正在使用StructureMap在我的ASP.NET MVC项目中执行DI。我把我的库分成了以下3个dll。
核心只包含所有接口和服务,数据包含它们的实现。
现在,当我在网站中设置StructureMap时,我需要告诉它扫描服务和数据程序集,因为它们包含核心接口的实现,但这意味着我必须在Web项目中引用它们,尽管它取决于在服务项目上,然后依赖于数据项目。
对我来说,在web项目中引用这两个dll是没有意义的,因为它破坏了抽象的好处?
有人可以向我解释一下我是否需要参考这些组件,然后首先使用单独的接口有什么好处?
答案 0 :(得分:2)
网络项目是您应用的composition root。组合根是应用程序中的一个单独位置,它组成应用程序的对象图。您不必从组合根引用程序集,您可以使用约定扫描程序集,但通常不值得IMO的努力。
通过让组合根引用依赖关系,你可以平衡依赖关系层次结构,从而允许更松散的耦合;请参阅Mark Seeman的出色解释here。
将应用程序划分为不同的项目(程序集)允许您在不同应用程序之间重用程序集中的功能,还可以按需加载应用程序的各个部分(使用插件体系结构)。 Don't overdo it。想一想为什么要拆分解决方案。其他程序员可能违反您的预期架构,即使您将解决方案拆分为多个项目以防止“错误方向”的引用。
你问的是使用单独接口是什么意思。接口提供了一种在代码中进行抽象的方法,以允许松散耦合和可组合性。通过programming towards the interface而不是具体实现,您可以轻松更改实现,而无需更改依赖代码。这使您可以更轻松地更改和调整应用程序。