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

时间:2014-08-06 10:27:39

标签: c# asp.net .net asp.net-mvc asp.net-mvc-3

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

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

只有当IClientdetails clientdetails作为构造函数的参数传递时才会出现这种情况,否则我会收到错误:Type passed as var。如果我可以看到/知道如何调用控制器的构造函数,我可以知道如何将这个初始化的接口传递给我的其他方法。

3 个答案:

答案 0 :(得分:1)

如果我理解了您的问题,您可以通过实施detail

的课程IClientDetails的实例化
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();
}
带有DefaultClass

是实现IClientDetails

的默认类

编辑2 *

获取所有实现此接口的类: Getting all types that implement an interface

你可以这样做:

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

然后您可以轻松识别所需的类(实现IClientDetails)。

答案 1 :(得分:1)

你所要求的是被称为依赖注入。

一个简单的例子是here

基本上你说你的应用程序,只要你看到这个接口实现这个类,每个人都有很多选项。

只需检查您的应用程序启动方法,您就会看到一些注射。

答案 2 :(得分:0)

延迟一点,但是对于需要它的人:ASP.NET MVC允许您指定要自动提供给调用者的对象。看一下主根目录中的Startup.cs,您应该会看到一些类似以下的代码:

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

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

此处有更多信息:https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/dependency-injection?view=aspnetcore-2.2