这个问题已经在这里有了答案:




9年前关闭。






我阅读了一些有关该主题的文章,但没有发现任何出色的优势。例如下面的代码:

//some action in a controller
//simplest solution:
var repository = new EmployeeRepository();
var model = repository.ListAllEmployees();

您可能会说:在此解决方案中, Controller /操作很大程度上取决于EmployeeRepository。依赖项解决方案是:
var repository = DependencyResolver.Current.GetService<IEmployeeRepository>();
var model = repository.ListAllEmployees();

没有任何依赖关系解决方案/IOC,我发现它没有比以下任何一种更好的方法:
var model = Managers.EmployeeManager.ListAllEmployees();

希望有人可以给我一些关于这个话题的想法/链接/帖子。

最佳答案

您的DependencyResolver示例并不比您的原始代码好多少,所以是的。这样做没有太多优势。

幸运的是,这不是您应该做的方式。而是使用构造函数或属性注入(inject)。

我同意@adriaanp的观点,简化单元测试只是依赖注入(inject)的一个附带好处。最大的好处是它鼓励了无依赖的体系结构。您的类(class)是独立的,并且不依赖于特定的实现(界面和要求除外)

另一个优点是,IoC容器可以控制依赖项的生存期。假设您要在网页的请求生存期内存在一个对象。还假设您要在许多不同的类中访问此对象。您可以在页面加载事件中创建对象,然后将其传递给创建的每个需要它的对象。但是,这可能意味着您需要将其传递给实际上不使用它的对象,这仅仅是因为它们创建了需要它的对象(或者它们创建了创建需要它的对象的对象,等等。)。

使用依赖项注入(inject)和IoC容器,容器可以控制对象的生存期,并处理将其注入(inject)到需要它的对象中的情况。您不必将其构建到您的设计中。您只是免费获得它。

最后,对于测试问题。测试某项内容时,如果其中包含一个经过硬编码的新内容,则无法轻松地将其替换为模拟对象来提供测试数据。假设您要测试对象是否正确计算了一个值。向其提供具有已知值的测试数据将使测试变得更加容易。

关于c# - 在ASP.NET MVC中依赖关系解析和IoC的优点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8116736/

10-12 12:43
查看更多