2010-10-16 19 views
1

Je connais Ninject et Ninject vous pouvez faire quelque chose de similaire àComment effectuer une liaison conditionnelle dans StructureMap à partir d'un registre et sans l'utilisation de génériques?

Bind<ICalendar>().To<MonthCalendar>().WhenInjectedInto(typeof(Roster)).InRequestScope(); 

Je ne sais pas comment réaliser quelque chose de similaire dans StructureMap. Je dois être capable de le faire dynamiquement à partir de ma propre liaison sans l'utilisation des méthodes génériques StructureMap. De plus, je dois être capable de le faire à l'intérieur d'une classe de registre. Par exemple ...

For(binding.Source).LifecycleIs(GetLifecycle(binding.Scope)).Use(binding.Destination); 

J'ai regardé stack overflow et codebetter pour des idées mais ne peut pas travailler sur la façon de faire la liaison conditionnelle comme dans l'exemple ci-dessus Ninject.

Répondre

0

Si j'interpréter votre configuration Ninject correctement - la solution générique sur la carte de la structure serait:

For<Roster>().HttpContextScoped().Use<Roster>() 
    .Ctor<ICalendar>().Is<MonthCalendar>(); 

Edit:

Pour faire la même chose avec des enregistrements entièrement dynamiques et à la place que vous devrait pouvoir utiliser ceci:

For(binding.Source).LifecycleIs(binding.Lifecycle) 
    .Use(binding.Destination).Child(binding.ChildSource) 
    .IsConcreteType(binding.ChildDestination); 

Pour configurer un enregistrement de type, vous pouvez utiliser une convention dynamique:

public class DynamicConvention : IRegistrationConvention 
{ 
     public void Process(Type type, Registry registry) 
     { 
      TypeRegistrationSettings typeSettings = FindTypeSettings(type); 
      if (typeSettings == null) 
       return; 

      registry.For(typeSettings.Source) 
       .LifecycleIs(typeSettings.Lifecycle).Use(typeSettings.Destination); 
     } 
} 

Où FindTypeSettings (type) regarderait vos propres liaisons.

La convention est inscrit sur une analyse:

ObjectFactory.Initialize(
       c => 
        c.Scan(s => { 
         s.TheCallingAssembly(); 
         s.Convention<DynamicConvention>(); 
        }) 
       ); 
+0

Oui, votre premier exemple était exactement ce que je cherchais, sauf que je voudrais le faire sans médicaments génériques et à l'intérieur d'une classe de registre. Est-ce possible? Comme je charge et traite des liaisons dans une classe de Registre je ne veux pas utiliser une méthode d'analyse. Il n'y a pas de version non générique de votre premier exemple disponible dans StructureMap? –

+0

Voir ma modification pour un nouveau coup en faisant la même chose de façon dynamique – PHeiberg