2016-12-15 1 views
0

je suit classeType de ne pas résoudre dans plusieurs usines

public class NightlyJob : IScheduleJob, IRecurringJob 

Pour les deux interfaces que j'ai simples usines typées comme ceci:

public interface IScheduleJobFactory 
{ 
    IEnumerable<IScheduleJob> Create(); 
} 

classe Mentionné n'est pas récupéré des deux usines. Create() méthodes. Il semble que la classe peut être récupérée à partir d'une seule usine en fonction de laquelle des interfaces de la signature est écrite en premier.

Ma question est de savoir s'il y a un moyen de contourner cela?

+0

Pourquoi avez-vous une usine? Ils sont [odeurs de code] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=100). – Steven

+0

L'usine dactylographiée de Castle semblait être la solution la plus simple. Tout ce que je dois faire est d'obtenir des implémentations d'une interface et en choisir une avec la propriété correspondante. – zmaten

+0

Pourquoi ne pas injecter 'IEnumerable ' dans votre (vos) client (s)? – Steven

Répondre

0

Après quelques recherches dans la direction suggérée par Steven dans les commentaires. J'ai trouvé ma solution pour injecter IEnumerable<IScheduleJob> et IEnumerable<IRecurringJob> dans les consommateurs directement. Ceux-ci sont résolus sous forme de collections de mises en œuvre à l'aide de CollectionResolverCastle comme ceci:

container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel)); 
     container.Register(
      Classes.FromAssemblyInDirectory(new AssemblyFilter(".")) 
       .BasedOn(typeof(IScheduleJob)). 
       WithServiceAllInterfaces() 
     );