Windows 窗体中可以避免构造函数过度注入吗?

J. *_*ini 6 .net c# dependency-injection winforms constructor-injection

我有一个 Windows 窗体。它包含许多控制器:网格、按钮,甚至TreeView. 其中大多数都定义了事件。例如,有多个独立事件以独立方式查询或命令我的 SQL 服务器。对于几乎所有情况,接口隔离原则迫使我不要合并这些接口。

因为我正在进行依赖项注入,所以我的 Windows 窗体的构造函数被大量过度注入。我在表单的构造函数中有四个参数,仅用于单个网格。示例包括:网格的初始填充、查询其中一个单元格中组合框的值列表、当另一种类型更改时重新填充某些类型的单元格等。我认为用不了多久我的构造函数就会有一些东西荒谬的是,像 20 个参数,所有查询服务器的接口。

这在 Windows 窗体中可以避免吗?据猜测,我认为如果我能够以某种方式构建每个组件,然后将它们输入到我的构造函数中,而不是让我的表单了解每个组件的依赖关系,我会更好。也就是说,我想我宁愿替换

MyForm(IQueryGridTimes TimeQueryRepo, ICommandGridTimeCells TimeCommandRepo, IQueryTheWholeGrid GridInitialPopulator, ..., IQueryForTheTreeView TreeViewPopulator)
Run Code Online (Sandbox Code Playgroud)

var grid = new WhateverGrid(IQueryGridTimes TimeQueryRepo, ICommandGridTimeCells TimeCommandRepo, IQueryTheWholeGrid GridInitialPopulator)
var tress = new WhateverTreeview(QueryForTheTreeView TreeViewPopulator)
MyForm(grid, ..., trees,)
Run Code Online (Sandbox Code Playgroud)

这既明智又可能吗?我对其他方法持开放态度,不需要假设任何依赖注入容器(我宁愿不使用任何容器)。

Bli*_*ndy 0

有许多不同的方法可以实现与您想要的类似的目标。

最小化依赖项数量的一种快速方法是聚合其中一些依赖项。仅仅填充一个网格就需要四个或更多依赖项,这似乎有点过分了。相反,您可以具有某种类型的存储库依赖项,该依赖项公开来自缓存或永久存储的所有必要数据。一个接口可以容纳多个功能。

或者,您可以不使用构造函数。大多数 DI 框架都按照惯例使用它们,但仅此而已。您可以轻松编写一个注入属性的 DI 框架,然后您只需提供要填充的引擎属性。

作为前面建议的后续,编写一个源生成器来为您处理 DI 对象的创建相对简单,而不需要诉诸反射。当你一开始只有几十个对象时,反射并不是那么糟糕,但源生成它们肯定更好。