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

C# 在asp.net-mvc中使用依赖项注入时,处理单操作依赖项的最佳方法是什么?,c#,asp.net-mvc,dependency-injection,inversion-of-control,C#,Asp.net Mvc,Dependency Injection,Inversion Of Control,我有一个asp.net-mvc站点,我正在使用Unity进行依赖项注入,我对控制器或模型类的所有依赖项都发生在类的构造函数中 我现在的一个问题是,实例化一个类的代价很高,而且它只在控制器内的单个操作中使用,因此我不想将它传递到构造函数中,以便在该控制器上调用的每个其他操作上实例化。我在网上看到的所有例子都有 处理这种情况的正确方法是什么?我只需要一个操作的依赖项。现在,我只是在构造函数类中执行“新建”操作,这是我想要避免的(因为我没有抽象和解耦依赖项实现),但至少我知道它不会对任何其他操作造成性

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

我现在的一个问题是,实例化一个类的代价很高,而且它只在控制器内的单个操作中使用,因此我不想将它传递到构造函数中,以便在该控制器上调用的每个其他操作上实例化。我在网上看到的所有例子都有


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

创建应用程序组件应该是正确的。任何繁重的初始化都应该推迟

当由于某些遗留代码的存在而无法实现时,您应该将组件包装在同一接口的代理实现后面。例如:

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);
}
公共类LazyServiceProxy:IService
{
私有只读服务;
公共LazyServiceProxy(惰性服务){
服务=服务;
}
void IService.Method(object param1)=>this.service.Value.Method(param1);
}

还请注意,依赖项仅用于单个操作这一事实表明控制器的操作方法之间的内聚性较低。低内聚性是(SRP)违反的标志。SRP规定每个类都应该有一个单独的职责,因此最好将操作及其依赖项移动到自己的控制器。虽然根据操作的通用url前缀(例如,
/customers/action
)将操作分组是一种常见做法,但MVC完全允许您将操作拆分为多个控制器,同时保留其原始url

谢谢你,史蒂文。我同意你上面的观点。就“MVC完全允许您将操作拆分为多个控制器,同时保持其原始url”而言,您是在谈论重定向吗?