Oop Castle Windsor(或任何IoC框架)和内部依赖关系

Oop Castle Windsor(或任何IoC框架)和内部依赖关系,oop,inversion-of-control,castle-windsor,ioc-container,Oop,Inversion Of Control,Castle Windsor,Ioc Container,我在使用内部类型的依赖注入时遇到了一些问题。虽然我已经使用Castle Windsor几年了,但我从来没有过多考虑可见性,所以所有的东西通常都是公开的(一部分是为了让Windsor开心,另一部分是为了方便在单元测试中进行模拟)。然而,我现在需要设计一个API 我理解下面的示例并不好,但它是为了说明一个场景,即公开一个不应该公开访问的依赖类型 假设我的API层公开了一个GetCustomer()方法。这将返回一个Customer类,该类公开一个sendmail()方法,该方法使用MailServi

我在使用内部类型的依赖注入时遇到了一些问题。虽然我已经使用Castle Windsor几年了,但我从来没有过多考虑可见性,所以所有的东西通常都是公开的(一部分是为了让Windsor开心,另一部分是为了方便在单元测试中进行模拟)。然而,我现在需要设计一个API

我理解下面的示例并不好,但它是为了说明一个场景,即公开一个不应该公开访问的依赖类型

假设我的API层公开了一个
GetCustomer()
方法。这将返回一个Customer类,该类公开一个
sendmail()
方法,该方法使用
MailService
类来实现电子邮件发送

我希望将邮件服务注入客户,但我不希望API的消费者能够访问
MailService
。我认为它不能是内部的,因为您不能将内部类型传递给公共构造函数。因此,将客户ctr设置为内部是有意义的(因为只有BLL应该创建它们),但Windsor会抱怨,因为注册的类型必须具有公共ctr

我觉得我失去了一些基本的东西。我该如何着手设计这样的东西呢?我想一个解决方案是接口,但在(通常)只有一个实现的情况下,为每个内部类型创建接口感觉不太对

我认为它不能是内部的,因为您不能将内部类型传递给公共构造函数

显然,如果公共构造函数依赖于内部类型,C#将不会编译您的类。但实际上,您可以将内部实现传递给公共构造函数,只要构造函数所依赖的接口也是公共的

因此,将客户ctr设置为内部是有意义的

这不是将构造函数设置为内部的好理由,因为这样可以很好地工作,但是如果您正在构建一个可重用的库,将构造函数设置为内部是非常有效的,因为一旦发布了库,更改公共构造函数就是一个突破性的更改。因此,将其内部化是一个很好的方法,可以让库在未来发生变化和发展

但温莎抱怨,因为注册类型必须有公共ctr

大多数DI库允许重写默认构造函数解析行为,如Castle Windsor

因为您正在创建一个可重用的库,所以我建议您阅读本文