在 asp.net-mvc 中使用依赖注入时,处理单一动作依赖的最佳方法是什么?

When using dependency injection in asp.net-mvc, what is the best way to deal with single action only dependencies?

我有一个 asp.net-mvc 站点,我正在使用 Unity 进行依赖注入,我对控制器或模型的所有依赖 classes 都发生在 [=20= 的构造函数中].

我现在的一个问题是 class 的实例化成本很高,而且它只在我的控制器内的单个操作中使用,因此我不想将它传递到构造函数中以在每次实例化时实例化在该控制器上调用的其他操作。我在网上看到的所有例子都有 dependencies being injected into the controller like this.

处理这种情况的正确方法是什么,我只需要一个动作的依赖项。现在我只是在我的构造函数 class 中做 "new" 这是我想避免的事情(因为我没有抽象和解耦依赖实现)但至少我知道它不会是任何其他操作都会影响性能。

您的应用程序组件的创建应该是 fast and their constructors should be simple。应推迟任何繁重的初始化。

如果由于某些遗留代码的存在而变得不可能,您应该将组件包装在同一接口的代理实现后面。例如:

public class LazyServiceProxy : IService
{
    private readonly Lazy<IService> service;
    public LazyServiceProxy(Lazy<IService> service) {
        this.service = service;
    }

    void IService.Method(object param1) => this.service.Value.Method(param1);
}

另请注意,您的依赖项仅用于单个操作这一事实表明您的控制器的操作方法之间的内聚性较低。低内聚是违反 Single Responsibility Principle (SRP) 的标志。 SRP 规定每个 class 应该有一个单一的责任,所以这可能意味着将操作及其依赖项移动到它自己的控制器是很好的。虽然根据通用的 url 前缀(例如 /customers/action)将操作组合在一起是一种常见的做法,但 MVC 完全允许您将操作拆分为多个控制器,同时保持它们原来的 url。