2010-10-24 8 views
2

Je suis nouveau sur structuremap. Je suis en train de se StructureMap pour vous inscrire auto-Utilisation de structemap pour enregistrer des types génériques

public void RegisterAllEventHandlers() 
{ 
    Scan(cfg => 
     { 
      cfg.TheCallingAssembly(); 
      //cfg.IncludeNamespaceContainingType<NewCustomerCreated>(); 
      cfg.IncludeNamespace("ParentNameSpace"); 
      cfg.AddAllTypesOf(typeof (IHandle<NewCustomerCreated>)); 
     }); 

     //For(typeof (IHandle<>)).Use(typeof (NewCustomerCreated)); 
} 

NewCustomerCreated est l'événement et je veux enregistrer tous Handlers pour cet événement soit ceux utilisant IHandle<NewCustomerCreated>

Le code suivant fonctionne, mais je suis sûr qu'il ne peut être fait par balayage: -

ObjectFactory.Initialize(x => 
    {              
     x.For(typeof(IHandle<NewCustomerCreated>)) 
      .Add(new NewCustomerCreatedHandler());                   
     x.For(typeof(IHandle<NewCustomerCreated>)) 
      .Add(new SendWelcomeEmailToNewCustomer()); 
    }); 

Je suis en train d'utiliser Raiser DomainEvent de http://blog.robustsoftware.co.uk/2009/08/better-domain-event-raiser.html

** Je vous serais reconnaissant si quelqu'un peut modifier la question pour refléter ce que je demande une meilleure façon **

Merci,

Mar

Edit 1: Ajout de code de blog de

public interface IEventDispatcher 
    { 

     void Dispatch<TEvent>(TEvent eventToDispatch) where TEvent : IDomainEvent; 

    } 


    public static class DomainEventDispatcher 
    { 

     public static IEventDispatcher Dispatcher { get; set; } 



     public static void Raise<TEvent>(TEvent eventToRaise) where TEvent : IDomainEvent 
     { 

      Dispatcher.Dispatch(eventToRaise); 

     } 

    } 


    public class StructureMapEventDispatcher : IEventDispatcher 
    { 

     public void Dispatch<TEvent>(TEvent eventToDispatch) where TEvent : IDomainEvent 
     { 

      foreach (var handler in ObjectFactory.GetAllInstances<IHandle<TEvent>>()) 
      { 

       handler.Handle(eventToDispatch); 

      } 

     } 

de mon projet de test, je fais appel classe de registre qui va scanner l'ensemble

public void RegisterAllEventHandlers() 
     { 
      Scan(cfg => 
      { 
       cfg.TheCallingAssembly(); 
       cfg.IncludeNamespace("Project1"); 
       //cfg.AddAllTypesOf(typeof(IHandle<NewCustomerCreated>)); 
       cfg.ConnectImplementationsToTypesClosing(typeof(IHandle<>)); 

      }); 

      // This initializes correctly 
      //ObjectFactory.Initialize(x => 
      //{ 
      // x.For(typeof(IHandle<NewCustomerCreated>)).Add(new NewCustomerCreatedHandler()); 

      //}); 



      // Handler returns 0 count 

      var handler =ObjectFactory.GetAllInstances<IHandle<NewCustomerCreated>>(); 





     } 

puis

var eventDispatcher = new StructureMapEventDispatcher(); 
      DomainEventDispatcher.Dispatcher = eventDispatcher; 

Répondre

2

Essayez ceci:

cfg.AddAllTypesOf(typeof (IHandle<>)); 

Ensuite, votre conteneur fera le reste:

var handler = container.GetInstance<IHandler<NewCustomerCreated>>(); 

Si vous avez besoin de plus de contrôle un coup d'oeil à ceci: https://stackoverflow.com/questions/516892/structuremap-auto-registration-for-generic-types-using-scan

+0

Le gestionnaire revient toujours vide. Est-il possible de trouver toutes les instances qui ont été ajoutées au conteneur lors de l'appel de AddAllTypesOf? – TheMar

+1

Je pense que je l'initialisais mal. J'ai dû faire ObjectFactory.Initialize (init => {init.AddRegistry ();}); et puis les choses ont commencé à fonctionner. Merci beaucoup – TheMar

+0

Être un newbie structuremap Je veux m'assurer que l'ajout du code ci-dessus était la bonne procédure et pas seulement un hack qui a fonctionné. Merci – TheMar