2010-01-09 3 views
1

Я пробовал код из этого сообщения на Event Driven Architecture (очень интересно, кстати). Его контейнер IOC - Unity, хотя я хотел бы сделать это, используя Структурную карту.Unity to Structure Map

Его код:

public class EventSubscriptions : ISubscriptionService 
{ 
    public static void Add<T>() 
    { 
     var consumerType = typeof(T); 

     consumerType.GetInterfaces() 
        .Where(x => x.IsGenericType) 
        .Where(x => x.GetGenericTypeDefinition() == typeof(IConsumer<>)) 
        .ToList() 
        .ForEach(x => IoC.Container.RegisterType(x, 
                  consumerType, 
                  consumerType.FullName)); 
    } 

    public IEnumerable<IConsumer<T>> GetSubscriptions<T>() 
    { 
     var consumers = IoC.Container.ResolveAll(typeof(IConsumer<T>)); 
     return consumers.Cast<IConsumer<T>>(); 
    } 
} 

У меня есть следующие, как представляется, не будет работать:

public class SubscriptionService : ISubscriptionService 
{ 
    public static void Add<T>() 
    { 
     var consumerType = typeof(T); 

     consumerType.GetInterfaces() 
      .Where(x => x.IsGenericType) 
      .Where(x => x.GetGenericTypeDefinition() == typeof (IConsumer<>)) 
      .ToList().ForEach(x => ObjectFactory.Inject(consumerType, x));         
    } 

    public IEnumerable<IConsumer<T>> GetSubscriptions<T>() 
    { 
     var consumers = ObjectFactory.GetAllInstances(typeof(IConsumer<T>)); 
     return consumers.Cast<IConsumer<T>>(); 
    } 
} 

Я, очевидно, не слишком хорошо знакомы со структурой карты. Некоторые ссылки или объяснение того, что я делаю неправильно, будут действительно оценены.

Update:

От ответа Хеннинга, я закончил с -

public class SubscriptionService : ISubscriptionService 
{ 
    public IEnumerable<IConsumer<T>> GetSubscriptions<T>() 
    { 
     var consumers = ObjectFactory.GetAllInstances(typeof(IConsumer<T>)); 
     return consumers.Cast<IConsumer<T>>(); 
    } 
} 

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

public static void ConfigureStuctureMap() 
     { 
      ObjectFactory.Initialize(x => 
      {  
       x.Scan(y => 
       { 
        y.Assembly("Domain");   
        y.Assembly("Website"); 
        y.AddAllTypesOf(typeof(IConsumer<>)); 
        y.WithDefaultConventions(); 
       }); 
      }); 
     } 

ответ

3

Хотя я не специалист по структуре, я считаю, что вы можете сделать это по-другому.

Structuremap имеет возможность сканировать любую сборку для данного интерфейса и автоматически регистрировать все реализации. Мы делаем это в моем текущем проекте, и он отлично работает.

Я не помню точный код, мы используем, но вы можете проверить документацию для сканирования сборки

http://structuremap.sourceforge.net/ScanningAssemblies.htm

0

Построить собственный класс TypeScanner, которые реализуют интерфейс ITypeScanner.

public class EventSubConventionScanner : ITypeScanner 
{ 
    public void Process(Type type, PluginGraph graph) 
    { 
     Type interfaceType = type.FindInterfaceThatCloses(typeof(IConsumer<>)); 

     if (interfaceType != null) 
     { 
      graph.AddType(interfaceType, type); 
     } 
    } 
} 

После того, как в реестре или инициализации рутинной записи:

Scan(x => 
     { 
      x.With<EventSubConventionScanner>(); 
     });