chk*_*ara 5 c# reflection dependency-injection .net-core
var fileName = string.Format(@"{0}\{1}\{2}.dll", Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)),"ProviderDLLS", $"UtilityPayments.Providers.TestProvider");
if (!File.Exists(fileName)) return null;
AssemblyName an = AssemblyName.GetAssemblyName(fileName);
Assembly assembly = Assembly.LoadFile(fileName);
Type objectType = assembly.GetType("UtilityPayments.Providers.TestProvider.Class1");
IProviderProcessor remoteAssembly = (IProviderProcessor)Activator.CreateInstance(objectType);
return await remoteAssembly.GetProviderData();
Run Code Online (Sandbox Code Playgroud)
我调用类方法,它IProviderProcessor使用反射实现接口。如果我在类中声明构造函数Class1并使用 DI 添加接口,则会收到此错误:
System.MissingMethodException:没有为类型“UtilityPayments.Providers.TestProvider.Class1”定义无参数构造函数。在System.RuntimeType.CreateInstanceDefaultCtorSlow(布尔publicOnly,布尔wrapExceptions,布尔fillCache)在System.RuntimeType.CreateInstanceDefaultCtor(布尔publicOnly,布尔skipCheckThis,布尔fillCache,布尔wrapExceptions)
在System.Activator.CreateInstance(类型类型,布尔nonPublic,布尔wrapExceptions) )
Class1构造函数:
public class Class1: IProviderProcessor
{
private readonly IProviderService _providerService;
public Class1(IProviderService providerService)
{
_providerService = providerService;
}
}
Run Code Online (Sandbox Code Playgroud)
Class1如果我想在构造函数中注入接口,如何使用反射调用方法?如果我删除构造函数,代码可以正常工作,但我需要使用应用程序中的其他功能Class1,这些功能是使用依赖项注入实现的。
谢谢您的帮助。我使用 serviceprovider 解决了这个问题,以获取注入到 Class1 类的构造函数中的接口实例。
var fileName = string.Format(@"{0}\{1}\{2}.dll", Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)),"ProviderDLLS", $"UtilityPayments.Providers.TestProvider");
if (!File.Exists(fileName)) return null;
AssemblyName an = AssemblyName.GetAssemblyName(fileName);
Assembly assembly = Assembly.LoadFile(fileName);
Type objectType = assembly.GetType("UtilityPayments.Providers.TestProvider.Class1");
var constructors = objectType.GetConstructors();
var firstConstrutor = constructors.FirstOrDefault(); //assume we will have only one constructor
var parameters = new List<object>();
foreach (var param in firstConstrutor.GetParameters())
{
var service = _serviceProvider.GetService(param.ParameterType);//get instance of the class
parameters.Add(service);
}
IProviderProcessor remoteAssembly = (IProviderProcessor)Activator.CreateInstance(objectType,parameters.ToArray());
return await remoteAssembly.GetProviderData();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5178 次 |
| 最近记录: |