【问题标题】:Constructor of controller in MVC applicationMVC应用中控制器的构造函数
【发布时间】:2014-09-29 05:58:20
【问题描述】:

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

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

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

【问题讨论】:

  • new ClientController(yourParamHere) 怎么样?
  • @AndreiV 没有得到你的问题?
  • 您是否尝试过实例化控制器,即只创建一个new 对象?
  • @AndreiV 是的,我做到了。正如我在问题中提到的那样,传递IClientDetails clientdetails 会产生错误。
  • 你只需要传递一个实现IClientDetails的对象:new ClientController(clientdetails)

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


【解决方案1】:

迟到了,但对于需要它的人来说: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

【讨论】:

    【解决方案2】:

    如果我理解你的问题,你可以传递一个实现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();
    }
    

    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)。

    【讨论】:

    • 我知道这个接口需要在某个地方实现。我要说的是,这个接口是在我正在使用的 dll 中的一个类中实现的,并且默认值已经初始化。如何在我的应用程序中使用此默认设置。
    • 谢谢,但是如果我不知道哪个类实现了它怎么办。我正在使用在我的项目中导入的 dll。我怎么知道哪个类实现了它。我只能看到接口,看不到实际的实现。
    【解决方案3】:

    你问的是依赖注入。

    一个简单的例子是here

    基本上你说你的应用程序在你看到这个接口实现这个类的地方也有很多选项。

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

    【讨论】:

      猜你喜欢
      • 2011-05-27
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-26
      • 1970-01-01
      • 2022-11-15
      相关资源
      最近更新 更多