NET.Core 未知构造函数的 2.0 IOC 问题
NET.Core 2.0 IOC issue for unknown constructor
我有点受困于 NET.Core 2.0 和 IOC。
我有不同的 class 实现 IAction 接口,那些 class
可以有不同的构造函数,我在初始化范围内不知道。这里有一个例子:
public class UpgradeAction : IAction
{
protected readonly IUpgradeManager upgradeManager;
public UpgradeAction(IUpgradeManager upgradeManager)
{
this.upgradeManager = upgradeManager;
}
public void Process(BaseRequest request)
{
upgradeManager.DoUpgrade(request);
}
}
目前,如果我使用此函数,我会收到 ParameterLess Constructor 的错误
var t = (IAction)Activator.CreateInstance(typeOfAction);
这个 returns 一个空对象。
var t = (IAction)serviceProvider.GetService(typeOfAction);
有什么方法可以初始化 IOC 配置以实现这种实现吗?以便使用所需的class的特定构造函数来执行注入。
实际上我在我的启动中添加了这个,还有更多。如果我不通过那个 ActionManager(所以 IUpgradeManager 直接注入我的 API 控制器),我所有的 IOC 都在工作。所以我可以做到这一点,仅此而已,但我想使用该 ActionManager 来启用一个命令到不同进程的管道,以构建一些可插入的体系结构。
public void Startup(IServiceCollection services)
{
services.AddTransient<IUpgradeManager, UpgradeManager>();
services.AddTransient<IAction, UpgradeAction>();
AutoMapper.DefaultMappers(typeof(DataLink).Assembly);
}
这样就可以了。
- 我们得到构造函数参数
- 我们调用服务提供者获取参数的对象
- 我们使用附加参数调用 CreateInstance 构造函数中要使用的对象。
var ci = action.GetConstructors().First();
var ciParameters = new List<Object>();
foreach(var parameter in ci.GetParameters())
{
ciParameters.Add(serviceProvider.GetService(parameter.ParameterType));
}
var t = (IAction)Activator.CreateInstance(action, ciParameters.ToArray());
要使用的其他选项
serviceProvider.GetService(typeof(UpgradeAction))
只注册class:
services.AddTransient<UpgradeAction>();
注册界面无效。也许我们需要 GetService 的一些重载方法才能使其工作 => GetService(type) ?
services.AddTransient<IAction, UpgradeAction>();
我有点受困于 NET.Core 2.0 和 IOC。
我有不同的 class 实现 IAction 接口,那些 class 可以有不同的构造函数,我在初始化范围内不知道。这里有一个例子:
public class UpgradeAction : IAction
{
protected readonly IUpgradeManager upgradeManager;
public UpgradeAction(IUpgradeManager upgradeManager)
{
this.upgradeManager = upgradeManager;
}
public void Process(BaseRequest request)
{
upgradeManager.DoUpgrade(request);
}
}
目前,如果我使用此函数,我会收到 ParameterLess Constructor 的错误
var t = (IAction)Activator.CreateInstance(typeOfAction);
这个 returns 一个空对象。
var t = (IAction)serviceProvider.GetService(typeOfAction);
有什么方法可以初始化 IOC 配置以实现这种实现吗?以便使用所需的class的特定构造函数来执行注入。
实际上我在我的启动中添加了这个,还有更多。如果我不通过那个 ActionManager(所以 IUpgradeManager 直接注入我的 API 控制器),我所有的 IOC 都在工作。所以我可以做到这一点,仅此而已,但我想使用该 ActionManager 来启用一个命令到不同进程的管道,以构建一些可插入的体系结构。
public void Startup(IServiceCollection services)
{
services.AddTransient<IUpgradeManager, UpgradeManager>();
services.AddTransient<IAction, UpgradeAction>();
AutoMapper.DefaultMappers(typeof(DataLink).Assembly);
}
这样就可以了。
- 我们得到构造函数参数
- 我们调用服务提供者获取参数的对象
- 我们使用附加参数调用 CreateInstance 构造函数中要使用的对象。
var ci = action.GetConstructors().First();
var ciParameters = new List<Object>();
foreach(var parameter in ci.GetParameters())
{
ciParameters.Add(serviceProvider.GetService(parameter.ParameterType));
}
var t = (IAction)Activator.CreateInstance(action, ciParameters.ToArray());
要使用的其他选项
serviceProvider.GetService(typeof(UpgradeAction))
只注册class:
services.AddTransient<UpgradeAction>();
注册界面无效。也许我们需要 GetService 的一些重载方法才能使其工作 => GetService(type) ?
services.AddTransient<IAction, UpgradeAction>();