2010-01-09 8 views
1

J'essaie le code de cet article sur Event Driven Architecture (très intéressant d'ailleurs). Son conteneur IOC est Unity et je voudrais le faire en utilisant Structure map.Unité pour structurer la carte

son code est:

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

Je donne les résultats suivants qui ne semble pas fonctionner:

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

Je ne suis évidemment pas trop familier avec carte de structure. Certains liens ou explications sur ce que je fais de mal seraient vraiment appréciés.

Mise à jour:

De la réponse de Henning, j'ai fini avec -

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

Et puis dans ma classe de bootstrapping qui est appelé au démarrage de l'application que j'ai:

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

Répondre

3

Bien que je ne sois pas un expert en structuremap, je crois que vous pouvez le faire d'une autre manière. Structuremap a la capacité de scanner un ensemble donné pour une interface donnée et d'enregistrer automatiquement toutes les implémentations. Nous faisons cela dans mon projet actuel et cela fonctionne vraiment bien.

Je ne me souviens pas le code exact que nous utilisons, mais vous pouvez consulter la documentation pour la numérisation de l'ensemble

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

0

Construire classe TypeScanner personnalisée qui mettent en œuvre l'interface 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); 
     } 
    } 
} 

Après, dans le registre ou l'initialisation d'écriture de routine:

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