Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET核心反射di_C#_Asp.net_Asp.net Core - Fatal编程技术网

C# ASP.NET核心反射di

C# ASP.NET核心反射di,c#,asp.net,asp.net-core,C#,Asp.net,Asp.net Core,我做了RabbitMQ的设置,例如我的扩展: public static class QueueExtension { public static IServiceCollection UseQueue<TQueue, TApiService>(this IServiceCollection services, string host, string login, string password, string queue, IDictionary<st

我做了RabbitMQ的设置,例如我的扩展:

public static class QueueExtension
{
    public static IServiceCollection UseQueue<TQueue, TApiService>(this IServiceCollection services, string host, string login,
        string password, string queue, IDictionary<string, object> arg) where TQueue : class, IEventHandler where TApiService : class, IService
    {
        if (services == null)
            throw new ArgumentNullException("services");
        return UseQueue<TQueue, TApiService>(services, typeof(TQueue), typeof(TApiService), host, login, password, queue, arg);
    }

    public static IServiceCollection UseQueue<T, Y>(this IServiceCollection services, Type queueType, Type apiServiceType, string host, string login,
        string password, string queue, IDictionary<string, object> arg) where T : IEventHandler where Y: IService
    {
        if (services == null)
            throw new ArgumentNullException("services");
        if (queueType == null)
            throw new ArgumentNullException("queueType");
        if (apiServiceType == null)
            throw new ArgumentNullException("apiServiceType");

        var parametersQueueType = queueType
            .GetConstructors()
            .SelectMany(p=>p.GetParameters())
            .Select(p=>p.ParameterType)
            .ToList();

       var parametersType = services
            .Where(p => parametersQueueType.Select(z => z.FullName)
            .Contains(p.ServiceType.FullName))
            .ToList();

       var parameters = new List<object>();

       parametersType.ForEach(p =>
       {
           parameters.Add((Y)Activator.CreateInstance(p.ImplementationType));
       });

        var impl = (T)Activator.CreateInstance(queueType, parameters);

        var queueService = new QueueServiceImpl(host, login, password, queue, arg);
        queueService.ReceivedMessage += (sender, ea) =>
        {
            var body = ea.Body;
            var message = Encoding.UTF8.GetString(body);
            impl.MessageHandler(message);
        };
        queueService.Start();

        return services;
    }

}
但它始终是错误的,在这一行中也会出现错误:

 var impl = (T)Activator.CreateInstance(queueType, parameters);
说:

找不到构造函数ontype
Monq.Core.Service.RSMModeGenerator.Services.PrimaryEventHandlerImpl

但这是我的
PrimaryEventHandlerImpl.cs

services.UseQueue<PrimaryEventHandlerImpl, IRsmService(
    Configuration[AppConstants.HostPrimary],   
    Configuration[AppConstants.LoginPrimary],
    Configuration[AppConstants.PasswordPrimary],
    Configuration[AppConstants.QueuePrimary], 
    arg
);
public class PrimaryEventHandlerImpl : IEventHandler
{
    private IRsmService _rsmService;

    public PrimaryEventHandlerImpl()
    {

    }
    public PrimaryEventHandlerImpl(IRsmService rsmService)
    {
        _rsmService = rsmService;
    }
    public void MessageHandler(string json)
    {
        var events = JsonExtensions.JsonToObject<Event>(json);
        if (events.Priority != 5)
        {
            //var services = _rsmService.GetServices();

        }
    }
}
公共类PrimaryEventHandlerImpl:IEventHandler
{
私人IRSMU服务;
公共PrimaryEventHandlerImpl()
{
}
公共PrimaryEventHandlerImpl(IRsmService RSMSService)
{
_rsmService=rsmService;
}
public void MessageHandler(字符串json)
{
var events=JsonExtensions.JsonToObject(json);
如果(events.Priority!=5)
{
//var services=rsmService.GetServices();
}
}
}
我想做什么使它正常工作?

更改

var impl = (T)Activator.CreateInstance(queueType, parameters);


你试图做的事情以非常简单和灵活的方式解决

static IServiceCollection UseQueue<T>(this IServiceCollection services, 
                                      RabbitMQOptions options) 
        where T : class, IEventHandler
    {
        if (services == null)
            throw new ArgumentNullException("services");
        if (options == null)
            throw new ArgumentNullException("options");

        services.AddTransient<T>();
        services.AddTransient<IQueueService, QueueServiceImpl>();
        services.AddSingleton<RabbitMQOptions>(sp => { return options; });

        var serviceProvider = services.BuildServiceProvider();

        var rabbitImpl = serviceProvider.GetService<T>();
        var queueService = serviceProvider.GetService<IQueueService>();

        queueService.ReceivedMessage += async (sender, ea) =>
        {
            var body = ea.Body;
            var message = Encoding.UTF8.GetString(body);
            await rabbitImpl.MessageHandler(message);
            queueService.Channel.BasicAck(ea.DeliveryTag, false);
        };
        queueService.Start();

        return services;
    }
静态IServiceCollection UseQueue(此IServiceCollection服务,
RabbitMQOptions(选项)
其中T:class,IEventHandler
{
if(服务==null)
抛出新的异常(“服务”);
如果(选项==null)
抛出新的ArgumentNullException(“选项”);
services.AddTransient();
services.AddTransient();
AddSingleton(sp=>{return options;});
var serviceProvider=services.BuildServiceProvider();
var rabbitImpl=serviceProvider.GetService();
var queueService=serviceProvider.GetService();
queueService.ReceivedMessage+=异步(发送方,ea)=>
{
变量体=ea.body;
var message=Encoding.UTF8.GetString(body);
等待rabbitImpl.MessageHandler(消息);
queueService.Channel.BasicAck(ea.DeliveryTag,false);
};
queueService.Start();
返回服务;
}
static IServiceCollection UseQueue<T>(this IServiceCollection services, 
                                      RabbitMQOptions options) 
        where T : class, IEventHandler
    {
        if (services == null)
            throw new ArgumentNullException("services");
        if (options == null)
            throw new ArgumentNullException("options");

        services.AddTransient<T>();
        services.AddTransient<IQueueService, QueueServiceImpl>();
        services.AddSingleton<RabbitMQOptions>(sp => { return options; });

        var serviceProvider = services.BuildServiceProvider();

        var rabbitImpl = serviceProvider.GetService<T>();
        var queueService = serviceProvider.GetService<IQueueService>();

        queueService.ReceivedMessage += async (sender, ea) =>
        {
            var body = ea.Body;
            var message = Encoding.UTF8.GetString(body);
            await rabbitImpl.MessageHandler(message);
            queueService.Channel.BasicAck(ea.DeliveryTag, false);
        };
        queueService.Start();

        return services;
    }