我们有一堆MVC和WebAPI项目,它们使用依赖注入来访问服务类和其他依赖项,例如来自两个框架中的控制器的依赖项。我遇到的问题是我想要为每个项目internal
制作特定的所有服务,但我不能,因为两个框架上的控制器类都需要公开,如果我试图这会导致编译错误使用构造函数注入接收内部类型的参数实例。
这不止一次地困扰我。几乎所有调用代码的框架都会发生这种情况,无论是Web框架,如WebAPI,MVC甚至WebForms,还是其他类型的项目,如测试,测试类也需要公开。
我对面向对象的理解一般是你希望尽可能地关闭一个范围,这样事情只能访问他们需要使用的一组最小特征。我发现这是一种非常好的方法,因为它可以最大限度地减少其他内容对每个类的影响,并且可以更清晰,更容易地发现代码。
我的服务类就是这样。它们被创建为仅由同一组件中的控制器使用,而不是由其他任何人使用。通过必须标记它们public
,我无缘无故地将它们暴露给外部调用者,并且通过这样做我丢失了许多重要的编译时间信息,例如FxCop会在没有人调用的情况下警告我来自内部类的某个方法,但它不能推断出该类是否标记为public,因为项目之外的其他人(甚至解决方案)可能正在使用该类型并调用该方法。
这显然扩展到接口。正如我所说,我们使用依赖注入(使用Unity),并且通常在该场景中为每个服务类都有一个接口。即使我可以将实现标记为内部,但需要将接口公开仍然不理想。
是否有一些模式可以让我干净地定义内部类和接口,但仍然可以使用外部框架,这些框架需要我面向外部的类才能公开,以便他们可以打电话给我?我应该如何进行以确保我的代码尽可能严格限定范围?