2016-03-22 17 views
0

Bir etki alanı olayını yükselten aşağıdaki yöntemi kullanıyorum. Bir IDomainEvent örneği, yönteme aktarılır ve SimpleInjector'ın GetAllInstances yöntemiyle sağlanan IDomainEventHandler örnekleri kullanılarak işlenir.SimpleInjector.GetAllInstances beklenmedik bir hata atıyor

public static void Raise<T>(T domainEvent) where T : IDomainEvent 
{ 
    if (Container != null) 
    { 
     var handlerType = 
      typeof(IDomainEventHandler<>).MakeGenericType(domainEvent.GetType()); 

     var handlers = Container.GetAllInstances(handlerType); 

     foreach (dynamic handler in handlers) 
     { 
      handler.Handle((dynamic)domainEvent); 
     } 
    } 
} 

Container bu yöntemi içeren sınıf önceden beslenir, ancak bir SimpleInjector IContainer bir örneğidir:

yöntem bu gibi. IDomainEvent benziyor

public class NewOrderEventHandler : IDomainEventHandler<NewOrderEvent> 
{ 
    public void Handle(NewOrderEvent args) 
    { 
     // Event handled here. 
    } 
} 

Ve örnek bir: Böyle bir NewOrderEvent için

bir örnek IDomainEventHandler görünüyor

public class NewOrderEvent : IDomainEvent 
{ 
    public IOrder Order { get; set; } 
} 

IDomainEventHandler<> gibi SimpleInjector kayıtlıdır:

var assemblies = new[] { 
      // Other assemblies use this too 
      typeof(NewOrderEventHandler).Assembly, // Event Handlers 
     }; 

container.Register(typeof(IDomainEventHandler<>), assemblies); 

Ne zaman tip IEnumerable<IDomainEventHandler<NewOrderEvent>> için

Hiçbir kayıt bulunamadı: Ben şu istisna olsun, yöntem çalıştırın. Bununla birlikte, , IDomainEventHandler<NewOrderEvent> için bir kayıttır; GetInstance<IDomainEventHandler<NewOrderEvent>>() mu demek istediniz ya da IDomainEventHandler<NewOrderEvent>?

Bunun neden çalışmadığını anlamıyorum - kimse yardımcı olabilir mi?

+0

"RegisterCollection" yerine "Register" kullandığınız anlaşılıyor: Lütfen 'IDomainEventHandler' – qujck

+0

@qujck OP'ye sahip kodu gösteren kodu gösterin. Container.Register (typeof (IDomainEventHandler <>), assembly) “Haklı olduğunu düşünüyorum. RegisterCollection yardımcı olmalıdır. –

+0

@qujck Sorun buydu (kayıt kodu yukarıda). Bir cevap yazarsak, kabul edebilirim. – Graham

cevap

3

hata Register yerine RegisterCollection kullanıyorsunuz beni inandıramaz: Register kayıtlı ürün RegisterCollection kayıtlı ürün GetAllInstances ile çözülür, GetInstance ile çözülür.