软件设计:DI - 多个程序集+非公共类型

时间:2016-06-21 22:19:49

标签: design-patterns dependency-injection architecture inversion-of-control software-design

我在这里发表的第一篇文章如此问好:)

我正在使用楼梯模式,例如我有程序集A(入口点 - 组合根),它取决于程序集B(包含接口)和程序集C,它包含程序集B中定义的接口的实现:

A - &gt; B < - C

我正在使用C#进行开发,而我正在使用Castle Windsor进行IoC。

我也在利用Windsor注册非公开类型的能力(https://github.com/castleproject/Windsor/blob/master/docs/registering-components-by-conventions.md - &gt;注册非公开类型)。我发现它很有用,因为我可以将程序集C中的类定义为内部,这意味着没有人会从A创建对C的直接依赖。这样,A和C都只依赖于程序集B,而程序集B只包含对我来说合适的抽象。

我想知道这是否是一个很好的设计选择。据我所知,只有温莎允许注册非公开类型,他们也警告不要公开非公开类型,因此我的问题。此外,我不认为这种考虑仅限于.NET世界,因此无论您使用何种技术,我都会深入了解此问题:)

1 个答案:

答案 0 :(得分:1)

有没有理由屏蔽C类从外部访问?这只有在你让第三方使用这个程序集时才有意义(即你将它作为NuGet包发布给其他人使用)。如果这个库的唯一消费者在你自己的团队中,隐藏内部只会使事情变得复杂,因为:

  • 测试变得更难,因为你必须使用[InternalsVisibleTo]标记内容。
  • 组合变得更难,因为您可以直接从合成根中引用您的组件。当您逐个注册它们时需要直接引用它们,这有时是必需的,或者您希望手动更新它们而不是让它们通过容器自动连接。
  • 由于组合根(程序集A)是唯一依赖于程序集B的程序集,因此基本上只隐藏组合根的依赖项,这没有什么意义,因为根据定义,组合根{{3在您的应用程序中。

另一方面,从可重用库的角度来看,使内部类很有意义。看看.NET框架本身及其内部有多少。在内部制作内容可以更轻松地更改内容而不会引入重大变化。