MVC应用程序中控制器的构造函数

本文关键字:构造函数 控制器 应用程序 MVC | 更新日期: 2023-09-27 18:16:42

何时调用控制器类的构造函数,如何调用?我之所以问这个问题,是因为在我维护的应用程序中,控制器的构造函数与Dll的接口一起传递,它们似乎是由Dll中的一些哑方法自动初始化的。控制器看起来像这样:

private _clientdetails
public CleintController(IClientDetails clientdetails)
{
    _clientdetails = clientdetails
}
//here various members of clientdetails used via _clientdetails

这似乎只有在IClientdetails clientdetails作为参数传递给构造函数时才有效,否则我会得到错误:Type passed as var。如果我可以看到/知道控制器的构造函数是如何被调用的,我就可以知道如何将这个初始化的接口传递给我的其他方法。

MVC应用程序中控制器的构造函数

你所要求的叫做依赖注入。

这里有一个简单的例子

基本上你说你的应用程序无论你在哪里看到这个接口实现这个类它们中的每一个都有很多选项。

检查你的应用程序启动方法,你会看到一些注射

如果我理解了你的问题,你可以传递一个实现IClientDetails的类detail的实例

public class detail : IClientDetails 
{
//detail class implementation
//interface method implementation
}
使用

CleintController(new detail());

detail d = new detail(){ proper1 = value,....};
CleintController(d);

编辑

如果你想使用接口的默认实现,只需在控制器中添加一个默认构造函数,如下所示:

public CleintController()
{
    _clientdetails = new DefaultClass();
}

with DefaultClass是实现IClientDetails的默认类

编辑2 *

获取所有实现这里提到的接口的类:获取实现接口的所有类型

你可以这样做:

var type = typeof(IClientDetails);
var types = AppDomain.CurrentDomain.GetAssemblies()
    .SelectMany(s => s.GetTypes())
    .Where(p => type.IsAssignableFrom(p));

,那么你可以很容易地确定你需要哪个类(实现了IClientDetails)。

有点晚了,但是对于需要它的人来说:ASP。NET MVC允许您指定要自动向调用者提供哪些对象。查看一下主目录下的Startup.cs,你应该会看到如下的代码:

public void ConfigureServices(IServiceCollection services)
{
    // Add application services.
    services.AddTransient<IDateTime, SystemDateTime>();
}

这段代码将为IDateTime的调用者提供一个SystemDateTime的新实例。

更多信息在这里:https://learn.microsoft.com/en-us/aspnet/core/mvc/controllers/dependency-injection?view=aspnetcore-2.2