关于c#:asp.net mvc中依赖性解析和IoC的优点

The advantages of Dependency Resolution and IoC in asp.net mvc

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Why do I need an IoC container as opposed to straightforward DI code?

我读了一些关于这个话题的文章,没有发现任何显著的优势。例如,此代码:

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

你可能会说:在这个解决方案中,控制者/行动很大程度上取决于雇员的情况。依赖关系解析为:

1
2
var repository = DependencyResolver.Current.GetService<IEmployeeRepository>();
var model = repository.ListAllEmployees();

在没有任何依赖性决议/IOC的情况下,我发现它没有比下面的更好:

1
var model = Managers.EmployeeManager.ListAllEmployees();

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


使用DependencyResolver的示例并不比原始代码好多少,所以是的。这样做没有什么好处。

谢天谢地,这不是你应该做的。相反,您使用构造函数或属性注入。

我同意@adriaanp的观点,更简单的单元测试只是依赖注入的一个附带好处。最大的好处是它鼓励无依赖性的体系结构。类是独立的,不依赖于特定的实现(接口和需求除外)

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

通过依赖注入和IOC容器,容器控制对象的生命周期,并处理将其注入到需要它的对象中。你不必把它融入你的设计中。你只要免费得到。

最后,对于测试问题。当你测试某个东西时,如果其中有一个硬编码的新东西,你就不能轻易地用一个模拟对象替换它来提供测试数据。假设您想测试一个对象是否正确地计算了一个值。向IT测试数据提供已知值使其更容易测试。


逆控制的主要优点是解耦。通过分离,您可以提高可维护性。控制器/操作取决于接口,实现被注入控制器。

通过IOC容器的依赖关系解析通过配置容器简化了控制器的依赖关系注入逻辑。如果一个类依赖于一个服务,那么这个服务依赖于其他服务,而这些服务也依赖于更多的服务,那么容器将处理这个依赖解析。

很多人可能会告诉你要实现控制反转才能测试你的代码,这不是控制反转所提供的,它确实让你的代码更容易测试,但这不是主要原因。