我有一个名为的界面IContext
。出于此目的,除了以下内容外,它的作用并不重要:
T GetService<T>();
该方法的作用是查看应用程序的当前DI容器,并尝试解决依赖关系。我认为还算标准。
在我的ASP.NET MVC应用程序中,我的构造函数如下所示。
protected MyControllerBase(IContext ctx)
{
TheContext = ctx;
SomeService = ctx.GetService<ISomeService>();
AnotherService = ctx.GetService<IAnotherService>();
}
因此,我不是在为每个服务的构造函数中添加多个参数(因为这对于扩展应用程序的开发人员来说确实很烦人和耗时),而是使用此方法来获取服务。
现在,感觉不对。但是,我目前在脑海中证明它的方式是这样- 我可以嘲笑它。
我可以。模拟IContext
测试控制器并不难。无论如何,我必须:
public class MyMockContext : IContext
{
public T GetService<T>()
{
if (typeof(T) == typeof(ISomeService))
{
// return another mock, or concrete etc etc
}
// etc etc
}
}
但是正如我所说,这感觉很不对劲。任何想法/虐待。
public SomeClass(Context c)
。这段代码很清楚,不是吗?它指出,that SomeClass
取决于Context
。错误,但请等待,事实并非如此!它仅依赖于X
从Context获得的依赖关系。这意味着,即使您仅更改s ,每次对其进行更改Context
都可能会中断。但是,是的,你知道,你只改不,所以是好的。但是编写好的代码不是您所知道的,而是新员工在第一次查看您的代码时所知道的。SomeObject
Context
Y
Y
X
SomeClass