c# - Ioc 中繁忙的构造函数——它们是代码的味道吗?

标签 c# .net design-patterns constructor inversion-of-control

我最终得到了一个看起来像这样的构造函数,同时试图得到一个我可以轻松测试的对象。

 public UserProvider(
            IFactory<IContainer> containerFactory,
            IRepositoryFactory<IUserRepository> userRepositoryFactory,
            IFactory<IRoleProvider> roleProviderFactory,
            IFactory<IAuthenticationProvider> authenticationProviderFactory,
            IFactory<IEmailAdapter> emailAdapterFactory,
            IFactory<IGuidAdapter> guidAdapterFactory,
            IRepositoryFactory<IVehicleRepository> vehicleRepositoryFactory,
            IRepositoryFactory<IUserVehicleRepository> userVehicleRepositoryFactory,
            IFactory<IDateTimeAdapter> dateTimeAdapterFactory)

这是对象将具有的所有依赖项,并且是我拥有的最繁忙的构造函数。但是,如果有人看到这个,它真的会引发巨大的 wtf 吗?

我的目标是最终得到易于测试的逻辑。虽然它需要大量模拟,但验证我的逻辑当然非常容易。但是我担心我可能会得到太多好东西。

我很好奇这对大多数实现 ioc 的人来说是否正常。

我可以做一些简化——比如我真的不需要为几个适配器传递工厂,因为我可以直接传递适配器,因为它没有内部状态。但我真的是在问参数的数量。

或者更确切地说,我正在寻求保证我不会过火 ;)

但我开始觉得应该对 UserProvider 类进行一些分解 - 但后来我得到了更多的管道,这就是引发这种担忧的原因。

我想一个子问题是,如果我有这些顾虑,我是否应该考虑使用服务定位器模式?

最佳答案

当使用 DI 和构造函数注入(inject)时,对 SRP 的违反变得非常明显。这实际上是一件好事,不是 DI/IOC 的错。如果您不使用构造函数注入(inject),该类将具有相同的依赖关系,只是不那么可见。

您在具体示例中可以做的是将一些相关的依赖项隐藏在外观后面。例如,IVehicleRepository 和 IUserVehicleRepository 可以隐藏在 IVehicle facade 后面。将 IUserRepository、IRoleProvider 和 IAuthenticationProvider 放在外观后面也可能有意义。

关于c# - Ioc 中繁忙的构造函数——它们是代码的味道吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10853920/

相关文章:

c# - PropertyGrid,设计者与运行时的行为有何不同?

.net - 开发人员可以使用哪些选项打印到专用标签打印机?

.net - Windsor 拦截器 AOP 和缓存

javascript - $ ('document' 情况下的 jQuery 最佳实践)。就绪

php - 开发业务代码时应该使用 IoC 依赖注入(inject)吗?

c# - 可扩展工厂设计模式

c# - ASTM 校验和计算

c# - 在 MVC 中包含来自程序集的 javascript

c# - 设计以避免派生类中的类型转换?

c# - 使用 Json.NET 反序列化字符串和对象的混合集合