2016-08-24 3 views
2

Я настройка RabbitMQ, например, мое расширение:ASP.NET ядро ​​отражения ди

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; 
    } 

} 

Я использую его в startup.cs:

services.UseQueue<PrimaryEventHandlerImpl, IRsmService(
    Configuration[AppConstants.HostPrimary], 
    Configuration[AppConstants.LoginPrimary], 
    Configuration[AppConstants.PasswordPrimary], 
    Configuration[AppConstants.QueuePrimary], 
    arg 
); 

Но это не так во все времена сделать ошибку в этом линия:

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

Говорят, что:

Конструктор ontype Monq.Core.Service.RSMModeGenerator.Services.PrimaryEventHandlerImpl не найден.

но это мой PrimaryEventHandlerImpl.cs:

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(); 

     } 
    } 
} 

То, что я хочу сделать, чтобы он работал правильно?

ответ

2

Изменить

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

в

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

thx, его действительно работа) –

1

Что у пытаются сделать раздела решает во многом простым и гибким способом.

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; 
    } 
Смежные вопросы