何时调用控制器类的构造函数以及如何调用?我问这个是因为在我维护的应用程序中,控制器的构造函数通过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
。如果我可以看到/知道如何调用控制器的构造函数,我可以知道如何将这个初始化的接口传递给我的其他方法。
答案 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)
答案 2 :(得分:0)
延迟一点,但是对于需要它的人:ASP.NET MVC允许您指定要自动提供给调用者的对象。看一下主根目录中的Startup.cs,您应该会看到一些类似以下的代码:
public void ConfigureServices(IServiceCollection services)
{
// Add application services.
services.AddTransient<IDateTime, SystemDateTime>();
}
这段代码将为IDateTime的调用者提供SystemDateTime的新实例。