2016-08-24 7 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(); 

     } 
    } 
} 

は、私は何をしたい、それが正常に動作させますか?

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

答えて

2

変更

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

Uは非常にシンプルかつ柔軟な方法で解決さをやろうとしているもの。

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

thx、その実際の作業) –