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

时间:2016-11-25 05:29:37

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

我有一个asp.net-mvc网站,我正在使用Unity进行依赖注入,并且所有依赖于控制器或模型类的依赖都发生在类的构造函数中。

我现在的一个问题是,一个类实例化是昂贵的,它只用在我的控制器内的单个动作中,因此我不想将它传递给构造函数,以便在调用的每个其他动作上实例化那个控制器。我在网上看到的所有示例都有dependencies being injected into the controller like this

处理这种情况的正确方法是什么,我只需要依赖一个动作。现在我只是在我的构造函数类中执行“new”,这是我想要避免的(因为我没有抽象和解耦依赖项实现)但至少我知道它不会对任何其他动作造成性能损失

1 个答案:

答案 0 :(得分:1)

创建应用程序组件应为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规定每个类应该只有一个责任,所以这可能会将操作及其依赖关系移动到自己的控制器上。虽然通常的做法是根据共同的URL前缀(例如/customers/action)将操作组合在一起,但MVC完全允许您将操作拆分为多个控制器,同时保留其原始URL。