Language agnostic NET中如何处理构造函数过注入问题

Language agnostic NET中如何处理构造函数过注入问题,language-agnostic,dependency-injection,Language Agnostic,Dependency Injection,如果那个问题已经讨论过,我很抱歉,但是我没有找到我想要的。我面临的问题更多的是模式和设计选择,而不是.NET本身。我只是想听听你的建议,知道从哪里开始我的重构 今天我在我的实际应用程序中打开了一个类,发现它有13个由构造函数注入的依赖项!!!事实上,每个开发人员都在他编写的方法中添加了所需的依赖性 我对DI理解的一点是,当我们通过构造函数注入依赖项时,这意味着它是一个强制依赖项,应该在类的所有方法中使用。如果我们只在给定类的一个方法中需要一个特定的依赖项,那么它对您意味着什么 给定的类做得太多

如果那个问题已经讨论过,我很抱歉,但是我没有找到我想要的。我面临的问题更多的是模式和设计选择,而不是.NET本身。我只是想听听你的建议,知道从哪里开始我的重构

今天我在我的实际应用程序中打开了一个类,发现它有13个由构造函数注入的依赖项!!!事实上,每个开发人员都在他编写的方法中添加了所需的依赖性

我对DI理解的一点是,当我们通过构造函数注入依赖项时,这意味着它是一个强制依赖项,应该在类的所有方法中使用。如果我们只在给定类的一个方法中需要一个特定的依赖项,那么它对您意味着什么

  • 给定的类做得太多了?我应该考虑创建一个新的类型,只需要一个依赖关系?
  • 我应该凭财产来注射吗?但在那个特定的方法中,依赖项是必须的,所以我认为这不是一个好的选择
  • 我应该用什么方法注射
困难的是找到正确的平衡。在现实中,有时不可能以干净的方式封装bahaviour


我正在考虑创建类似服务聚合器的东西,以消除其中一个服务聚合器背后的相关依赖性,但如果您有其他建议,我会很高兴。提前感谢。

仅仅因为依赖项是强制性的,并不意味着它应该在类的所有方法中使用,IMO。它应该只是类本身配置的逻辑部分


另一方面,如果一个类有13个依赖项,那么它可能做得太多了。这些依赖项在逻辑上是否属于一起?也许依赖项本身应该“更粗”,或者很可能您的类应该做得更少。

这听起来像是一个类有太多依赖项的情况,即它是一个上帝类。尝试将其分解为更多的独立职责。

你是正确的:如果你需要向一个类中注入13个依赖项,那么这很明显表明你违反了规则切换到不会有帮助,因为它不会减少依赖项的数量-它只意味着这些依赖项是可选的,而不是强制性的

基本上,处理这类问题有两种方法:

  • 。这基本上是一种不间断的重构,因为它维护了控制器的功能。但是,它改变了对协调/编排服务之间交互的责任,而不是管理实现的细节
  • 将类拆分为独立的类。如果每个服务都是由不同的开发人员引入的,以支持方法的子集,那么这就是低内聚性的标志。在这种情况下,最好将类拆分为几个独立的类

特别是对于ASP.NET MVC,您可能不希望拆分控制器,因为它将更改您的URL方案。这是公平的,但是考虑一下这意味着什么:它意味着控制器的单一职责应该是<强>映射URL到应用程序代码< /强>。换句话说,这就是一个控制器应该做的,然后正确的解决方案是重构到Facade服务,如果你的类有13个依赖项,那么你肯定会遇到问题。很明显,你们班承担的责任太多了。Marc Seemann在他的书《.NET中的依赖注入》第6.4段中讨论了这个问题。如果你的类开始在构造函数中有3个参数,你一定会感到奇怪。我的班级仍在履行一项职责吗?如果您的构造函数中开始有4个或更多参数,请通过使用facade或composition模式重构类。

这正是DI的工作方式。这是事实。所以接受它。它在类似Pdf服务的服务中完全合法,请查看以下代码:

public PdfService(ILocalizationService localizationService, 
        ILanguageService languageService,
        IWorkContext workContext,
        IOrderService orderService,
        IPaymentService paymentService,
        IDateTimeHelper dateTimeHelper,
        IPriceFormatter priceFormatter,
        ICurrencyService currencyService, 
        IMeasureService measureService,
        IPictureService pictureService,
        IProductService productService, 
        IProductAttributeParser productAttributeParser,
        IStoreService storeService,
        IStoreContext storeContext,
        ISettingService settingContext,
        IAddressAttributeFormatter addressAttributeFormatter,
        CatalogSettings catalogSettings, 
        CurrencySettings currencySettings,
        MeasureSettings measureSettings,
        PdfSettings pdfSettings,
        TaxSettings taxSettings,
        AddressSettings addressSettings)

相关:是的,我考虑去做。我面临的另一个困难是注入依赖项混合在一起。在一个方法中,我需要依赖项A和D,在下一个方法中,我认为问题更重要,仅仅重构God类还不够,因为我会发现自己将相同的依赖项注入到较小的类中?你是唯一可以分析依赖项的人,但我猜,如果您将类分解,那么只需要依赖项的子集。事实上,许多开发人员正在添加依赖项,这是一种非常强烈的上帝类气味,随着时间的推移,这种气味只会变得更糟。最终你将到达临界点,宇宙中没有足够的时间重构所有的上帝类。我将尝试将其分解为更小的类,但就我所见,注入的依赖项也相互依赖。例如,一个依赖项需要另一个来完成它的任务,我担心在分解成更小的类之后,我仍然应该注入相同的依赖项。也许不是13个,但其中一些。