我目前正在使用 Ninject 处理 C#/.Net/MVC 应用程序上的 DI。当我跟踪服务实例的创建时,我发现服务在生命周期中被调用和构造的次数很多,因此我必须实例化服务并缓存它们,然后在实例化另一个服务之前检查缓存的服务。构造函数有时很重)。
对我来说这似乎很荒谬,因为服务不需要唯一的构造函数参数,因此对整个应用程序范围来说,实例化它们一次就足够了。
我作为一个快速替代方案所做的(现在只是为了概念验证,看看它是否有效)是......
- 创建了一个静态类(称为 AppServices),其中包含我所有的服务接口作为它的属性。
- 给定这个类一个 Init() 方法,该方法从我的服务库中实例化每个服务接口的直接实现。如果我使用 Ninject(或其他 DI 处理程序),这会模拟将它们绑定到内核。
例如
public static class AppServices(){
public IMyService MyService;
public IMyOtherService MyOtherService;
public Init(){
MyService = new MyLib.MyService();
MyOtherService = new MyLib.MyOtherService();
}
}
- 在 App_Start 上,我调用 Init() 方法来创建仅实例化一次的全局可访问服务列表。
- 从那时起,每次我需要一个服务实例时,我都会从 AppServices 中获取它。这样我就不必继续构建我不需要的新实例。
例如
var IMyService _myService = AppServices.MyService;
这工作正常,我还没有出现任何问题。我的问题是这似乎太简单了。它只是几行代码,在应用程序范围内创建了一个静态类。因为它完全符合我需要 Ninject 做的事情,但是(在我看来,出于我的目的)一种更清洁和节省性能的方式,为什么我需要 Ninject?我的意思是,创建这些复杂的依赖注入处理程序是有原因的,对吧?我对 DI 的“简单”解释一定有问题,我就是看不到。
谁能告诉我为什么为我的服务实例创建一个全局静态容器是一个坏主意,也许可以准确解释是什么让 Ninject(或任何其他 DI 处理程序)如此必要。我了解 DI 的概念,所以请不要试图解释是什么让它如此出色。我知道。我想确切地知道它在幕后做了什么,这与我的 App_Start 方法如此不同。
谢谢