Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC 3中的依赖项注入说明和依赖项解析程序?_C#_Asp.net Mvc 3_Dependency Injection_Ninject - Fatal编程技术网

C# ASP.NET MVC 3中的依赖项注入说明和依赖项解析程序?

C# ASP.NET MVC 3中的依赖项注入说明和依赖项解析程序?,c#,asp.net-mvc-3,dependency-injection,ninject,C#,Asp.net Mvc 3,Dependency Injection,Ninject,我有一个服务(AccountService),它大约有八种方法。其中一种方法发送电子邮件。我有另一个服务(EmailService),它被注入AccountService 我想知道是否有必要这样做,因为每次我向一个方法添加带有依赖项的功能时,我都必须更改所有测试,在这些测试中,我要模拟构造函数的依赖项。这让人感觉DI实际上让改变事情变得更难,而不是更容易 因此,我考虑在我的控制器操作中使用DependencyResolver,它调用AccountService来获取EmailService并将其

我有一个服务(AccountService),它大约有八种方法。其中一种方法发送电子邮件。我有另一个服务(EmailService),它被注入AccountService

我想知道是否有必要这样做,因为每次我向一个方法添加带有依赖项的功能时,我都必须更改所有测试,在这些测试中,我要模拟构造函数的依赖项。这让人感觉DI实际上让改变事情变得更难,而不是更容易

因此,我考虑在我的控制器操作中使用DependencyResolver,它调用AccountService来获取EmailService并将其传入。然而,这会影响我的测试吗

我将如何测试使用依赖项解析器的控制器操作?假设帐户服务是由ninject注入AccountController的构造函数


干杯。

您是否考虑过使用属性DI,或者是否有必要将其注入.ctor? 顺便说一句:对于您的测试,您是否使用了某种模拟框架(例如Moq、Rhinomock)


希望它能帮助您。

不要在控制器中使用DependencyResolver!只需使用它来使用Ninject创建控制器(请参阅)。其他所有内容都应该由Ninject使用构造函数注入创建

实际上,使用适当的DI和遵循可靠原则的设计进行单元测试是非常容易的

在测试夹具设置中,您只需为每个依赖项创建一个(动态)模拟,并使用创建的模拟作为依赖项创建一个被测试对象的实例。这样,您必须为每个类的所有测试准确地调用构造函数一次


如果测试很难,那不是因为DI,而是因为没有遵循可靠的原则(很可能是单一责任原则)或者因为糟糕的测试,例如使用依赖项的真实实例而不是模拟的单元测试,或者在测试夹具设置中做了太多的工作。

应该避免属性注入,除非依赖项是可选的,并且服务可以在没有依赖项的情况下使用。您可能在测试中是正确的,我是否应该将模拟设置为测试装置中的字段,以便向其添加功能?有时我会使用赝品,例如在记忆中记录而不是模仿。并不是说测试很难,只是因为我倾向于尝试让测试原子化,所以所有的设置都是在每种情况下进行的。我将回顾我为SRP提供的服务,并尝试将正在测试的类的初始化移出。谢谢你的提示。