.NET Framework类的Unity最佳实践

时间:2009-05-14 17:14:43

标签: c# .net dependency-injection inversion-of-control

我刚刚开始使用任何DI / IoC工具集,并且有一个非常基本的问题。我正在使用Unity,因为我们还将在整个应用程序中使用许多Enterprise Library块。

我遇到的问题是围绕.NET框架类的依赖关系。例如,在我目前正在处理的一个类中,我需要创建DirectoryInfo类。根据我的理解,DI中的最佳实践之一是永远不要使用“new”关键字 - 因为这引入了一种硬依赖关系。那我该如何获得一个新的DirectoryInfo?将它作为项添加到容器中,并使容器成为类的依赖项?这似乎在现实生活中使用是不切实际的,因为我最终会将容器配置成数以千计的框架类。我认为这是一场维护噩梦。

4 个答案:

答案 0 :(得分:0)

我想说这有点过于工程化了。我认为应该传入要创建的DirectoryInfo的路径,或者传递某种类型的配置存储库(或服务)类,它保存(或提供一种获取方式)数据。

答案 1 :(得分:0)

我不会在容器中注册像DirectoryInfo这样的低级别类 - 在应用程序的某些地方使用new不是一个问题,只要这个要求不会“泄漏”到更高级别的类中。所以在这个例子中,直接在一个类中创建和使用DirectoryInfo可能是有意义的,但是该类的实例是由容器注入它们的依赖项。

答案 2 :(得分:0)

首先,您可以看作SystemWrapper库。它包装了DirectoryInfo对象,因此您可以对其进行模拟。

接下来,您可以查看tutorial to TDD using Rhino Mocks and SystemWrapper。你可以看到DI的用法;但是,那里的例子没有使用任何IoC。

希望它有所帮助。

答案 3 :(得分:0)

我看到它的方式,BCL(基类库)中的大多数类都是utiity类,并且除了直接调用图之外通常没有大量其他依赖项。

DI旨在压缩调用图并防止类之间的大量串扰。因此,以及你无法对BCL的烦恼做任何事情的事实,你也可以接受它们的本身,继续使用新的......

您不想要的唯一原因是出于测试目的。你通常不会测试BCL类,但是你可能想用一个模拟版本替换一个BCL类,这样它实际上不会做任何类的操作,只是假装这样做..你可以使用像SystemWrapper在必要时执行此操作。