Использование Structuremap для регистрации общих типов - PullRequest
2 голосов
/ 24 октября 2010

Я новичок в структуре карты.Я пытаюсь получить Structuremap для автоматической регистрации

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 - это событие, и я хочу зарегистрировать все обработчики для этого события, т.е. те, которые используют IHandle<NewCustomerCreated>

Следующий кодработает, но я уверен, что это может быть сделано путем сканирования: -

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

Я пытаюсь использовать DomainEvent Raiser с http://blog.robustsoftware.co.uk/2009/08/better-domain-event-raiser.html

** Буду признателен, если кто-то может редактироватьвопрос, чтобы лучше отразить то, что я спрашиваю **

Спасибо,

Мар

Редактировать 1: Добавление кода из блога

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

            }

        }

Из моего тестового проекта я вызываю класс реестра, который будет сканировать сборку

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





        }

, а затем

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

1 Ответ

2 голосов
/ 24 октября 2010

Попробуйте это:

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

Тогда ваш контейнер сделает все остальное:

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

Если вам нужно больше контроля, взгляните на это: /538238/structuremap-avtomaticheskaya-registratsiya-universalnyh-tipov-s-ispolzovaniem-scan

...