1

我的第一篇文章,所以你好所有:)软件设计:DI - 多个程序集+非公开类型

我正在使用楼梯模式,例如,我装配A(入口点 - 组合物根),这依赖于组件B(含有接口)和组装体C包含在组件B中定义的接口的实现:

A - >乙< - Visual C

我正在用C#开发,我正在使用Castle Windsor作为IoC。

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

我想知道如果这是一个很好的设计选择。据我所知只有温莎允许注册非公共类型,他们也警告不公开类型,因此我的问题。此外,我不认为这个考虑因素仅限于.NET世界,所以我会欣赏洞察这个问题,无论你使用的技术如何:)

+0

我已经在Autofac中使用每个具有内部类型的程序集中的模块完成了相同的操作。主入口程序集只知道它需要注册的模块(例如:电子邮件模块等) – Bishoy

回答

1

是否有任何理由屏蔽类的C从外部访问?这只有在第三方使用此程序集时才有意义(即,您将其作为NuGet程序包发布以供其他人使用)。如果这个库的唯一消费者是你自己的团队里面,隐藏了内部唯一复杂的事情,因为:

  • 测试变得更加困难,因为你必须标记与[InternalsVisibleTo]的东西。
  • 构图变得更加困难,因为您可以直接从组合根中引用组件。当您逐个注册它们时,需要直接引用它们,有时需要它们,或者您希望手动创建它们,而不是让它们通过容器自动布线。
  • 由于组合体根(组合体A)是组合体B上唯一依赖的组合体,因此基本上只隐藏组合体根的依赖性,这是毫无意义的,因为根据定义,组合体根depends on all assemblies应用。

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

+0

在C内部实现实现的主要原因是强制A对B抽象的依赖关系,并避免任何人引入依赖关系从C的实现。另外,假设我在C中有10个类,并且其中一半提取了接口(C内部)以便于测试 - 我不希望这些接口暴露给A以避免引入不需要的依赖关系A的C 2.避免用手接线。因此,C中的所有类和接口都是由Windsor使用IncludeNonPublicTypes选项进行内部和自动连接的。 –

+0

直到有人添加了InternalsVisibleTo属性,并且所有内容都可以再次访问。尝试使用像NsCop这样的工具来管理名称空间依赖关系或编写一个单元测试,以防止从一个程序集到另一个程序集的依赖关系。另外,如果没有代码审查和与开发人员就为什么有这样的规则进行适当的沟通,这个规则就会失败。由于时间压力和康威定律,建筑规则将被打破。 – Steven

+0

尽管我发现代码评论是无价的,但我认为在更大的团队中这是不够的,所以我会尽可能地执行。但是可能以这种方式处理(使内部类)是错误的方法,我宁愿按照通过自动化测试路径执行的体系结构规则进行操作?一般来说,我最初的问题是,如果在程序集C中内部创建类,并依靠DI来自动解决依赖关系,这是一种设计气味? –