【发布时间】:2012-07-11 13:51:11
【问题描述】:
我通过构造函数注入使用 IoC 容器而不是 DI。有些人可能会问为什么我使用 IoC 容器而不是构造函数注入。好吧,原因如下:Why do I need an IoC container as opposed to straightforward DI code?。 但是,我发现为我的服务创建单元测试很困难。我不确定如何在运行时模拟我的服务使用的存储库,因为我没有使用构造函数注入(一个难题)。任何人有任何解决方案?
例如:
public class SomeService
{
private ISomeServiceRepository someServiceRepository;
public GetSomeThing()
{
//how do I mock this repository in my unit test
someServiceRepository = IoC.Resolve<ISomeServiceRepository>();
someData = someServiceRepository.getData();
someOtherService = new SomeOtherService();
someThing = someOtherService.GetSomeThing();
return FigureOutSomeThingElse(someData, someThing);
}
public FigureOutSomeThingElse(someData, someThing)
{
//do some figuring
return somethingElse;
}
}
public class SomeOtherService
{
private ISomeServiceRepository someOtherServiceRepository;
public GetSomeThing()
{
//how do I mock this repository in my unit test
someOtherServiceRepository = IoC.Resolve<ISomeOtherServiceRepository>();
var someData = someOtherServiceRepository.getData();
return someData;
}
}
【问题讨论】:
-
“有人有解决方案吗?”。是:使用构造函数注入!
-
构造函数注入会很快变得一团糟,除非您正在构建夫妻应用程序。例如,我从这个 New SomeService (ISomeRepository) 开始,但后来随着需求的变化,我必须添加这个 New SomeService(ISomeRepository, IAnotherRepository)。现在我得回去改一堆代码了。
-
如果 ctor 注入变得混乱,那么你做错了。在 SO 上搜索,您会发现很多关于 ctor 注入的信息,以及许多很好的答案,解释了为什么 ctor 注入是可行的方法,以及当它不适合您时您做错了什么。
-
嘿,我思想开放,但是您如何解决我上面解释的问题?
-
“出于此处所述的原因”。你能重申一下你的确切问题是什么。我很难从提供的链接中找出您的问题。
标签: c# .net unit-testing ioc-container