什么策略可以在库中使用IoC容器?

Owe*_*enP 8 c# testing inversion-of-control

其余问题的更短版本:我遇到了问题,而IoC容器是一个工具.问题听起来像是IoC可以解决的问题,但我还没有阅读足够的工具说明以确定.我很好奇,如果我选错了工具或说明书的哪一章我可以跳过去寻求帮助.

我在Windows窗体控件库上工作.在过去的一年里,我偶然发现了单元测试,并对提高自动化测试的质量充满热情.测试控制很困难,并且在线没有太多关于它的信息.其中一个令人讨厌的事情是交互逻辑与UI胶水的分离,它调用它导致每个控件具有比我通常认为对于类健康更多的依赖性.在测试它们与控件的集成时为这些元素创建假货非常繁琐,我正在研究IoC的解决方案.

有一个障碍我不确定如何克服.要设置容器,您需要有一些在应用程序其余部分之前运行的引导程序代码.在一个应用程序中,这个东西有一个非常明确的地方.在图书馆,它不是那么清楚.

想到的第一个解决方案是创建一个类,该类提供容器的静态实例,并在其类型初始值设定项中设置容器.这适用于运行时,但在测试环境中,我不确定它的效果如何.允许测试并行运行,许多测试需要不同的依赖关系,因此静态共享状态将是一场噩梦.这让我相信容器创建应该是一个实例方法,但是我有一个鸡和蛋问题,因为控件必须在它创建自己之前构造它的容器.想到控件的类型初始值设定项,但我的测试将无法修改此行为.这让我想到使容器本身成为控件的依赖,其中用户可见的构造函数提供运行时默认实现,但是这要由我的测试来设置自己的容器.我没有考虑过这个问题,但似乎这与我现在的工作水平相同:每次测试必须初始化3-5个依赖项的测试.

通常情况下,我会自己尝试很多东西,看看有什么疼.我目前处于严格的期限之下,所以在编写代码时我没有太多时间进行实验; 我只是在短暂的时间内思考这个问题并且没有太多的论文.我确定其他人也遇到过类似的问题,所以如果我不需要重新发明轮子那就太好了.

还有其他人攻击过这个问题吗?是否有一些战略可以满足这些需求?由于我的经验不足,我只是一个新手和过于复杂的事情吗?如果是后者,我会喜欢你想分享的任何资源来解决我的无知.

更新:

我想回应Mark Seeman的回答,但它需要比评论字段允许的更多字符.

我已经玩弄了演示模型模式.在这种情况下,视图是公共控件类,每个视图都有一个或多个控制器类.当在控件上触发某个UI事件时,它执行的唯一逻辑是决定需要调用哪些控制器方法.

探索这种设计的简短表达是我的控制器类与它们的视图紧密耦合.根据DI容器使用松散耦合代码的说法,我正在阅读"错误的工作工具".我可能能够设计一个更松散耦合的架构,此时DI容器可能更容易使用.但这需要一些重大的努力,而且需要对已发布的代码进行大修; 我会不得不尝试新的东西,然后匆匆走近旧的东西.这是另一天的问题.

为什么我甚至想要注入强耦合类型而不是使用本地默认值?一些接缝旨在成为高级用户的可扩展点.我必须测试涉及不正确实现的各种场景,并验证我是否符合我的合同; 模拟对象非常适合.

对于目前的设计,克里斯巴拉德关于"穷人的DI"的建议是我或多或少关注的,对于我的强耦合类型,这只是很多繁琐的设置.我有这个愿景,我能够将所有这些乏味的东西推到一些DI容器设置方法中,但是我越努力证明这种方法,我就越相信我会变成我试图用大锤挂图片.

我会等待24小时左右,看看在接受之前是否进一步讨论.

Mar*_*ann 5

依赖注入(Inversion of Control)是一组原则和模式,可用于组合松散耦合的代码.这是代码松散耦合的先决条件.一个DI容器是不会让你的代码松耦合.

您需要找到一种方法来将UI呈现与UI逻辑分离.有很多演示模式描述了如何做到这一点:模型视图控制器,模型视图演示器,演示模型等.

一旦你有良好的解耦,DI(和容器)可以用来组成协作者.


Chr*_*ard 2

根据您的框架的复杂程度,您可能会摆脱基于手动编码构造函数的依赖项注入,使用无参数默认构造函数(使用正常的具体实现),但使用第二个构造函数来注入依赖项以用于单元测试目的,例如。

private IMyDependency dependency;

public MyClass(IMyDependency dependency)
{
    this.dependency = dependency;
}

public MyClass() : this(new MyDefaultImplementation())
{

}
Run Code Online (Sandbox Code Playgroud)

  • 这种策略也被称为“[穷人的依赖注入](http://lostechies.com/chadmyers/2009/07/14/just-say-no-to-poor-man-s-dependency-injection/)” 。 (3认同)