2017-04-04 1 views
0

Autofac ont quelque chose de semblable aux profils de StructureMapStructureMap a des profils quel est l'équivalent dans Autofac? Est-ce que

IContainer container = new Container(registry => 
{ 
    registry.Profile("something", p => 
    { 
     p.For<IWidget>().Use<AWidget>(); 
     p.For<Rule>().Use<DefaultRule>(); 
    }); 
}); 
+1

pourriez-vous expliquer brièvement ce que font les profils? –

+0

Les profils permettent à la structure des graphes d'objet de changer en fonction des conditions d'exécution (le nom du profil). – Steven

Répondre

0

De StructureMap documentation

Profils sont juste nommaient conteneurs enfants qui peuvent être configurés dès le départ par des configurations de registre.

Vous pouvez avoir le même comportement dans Autofac lors de la création d'un champ de vie des enfants.

using (ILifetimeScope scope = container.BeginLifetimeScope(childBuilder => 
{ 
    childBuilder.RegisterType<AWidget>().As<IWidget>(); 
    childBuilder.RegisterType<DefaultRule>().As<Rule>(); 
})) 
{ 
    // do things 
} 

Si vous voulez le nommer, vous pouvez utiliser un tag, qui est un objet et pas seulement une chaîne.

using (ILifetimeScope scope = container.BeginLifetimeScope("something", childBuilder => 
{ 
    childBuilder.RegisterType<AWidget>().As<IWidget>(); 
    childBuilder.RegisterType<DefaultRule>().As<Rule>(); 
})) 
{ 
    // do things 
} 

Et si vous voulez avoir une équivalence de la méthode GetProfile, vous pouvez utiliser cet exemple de code:

ContainerBuilder builder = new ContainerBuilder(); 

builder.Register(c => c.Resolve<ILifetimeScope>() 
      .BeginLifetimeScope("A", _ => 
      { 
       _.RegisterType<FooA>().As<IFoo>(); 
      })) 
     .Named<ILifetimeScope>("A"); 

builder.Register(c => c.Resolve<ILifetimeScope>() 
      .BeginLifetimeScope("B", _ => 
      { 
       _.RegisterType<FooB>().As<IFoo>(); 
      })) 
     .Named<ILifetimeScope>("B"); 

// build the root of all profile 
IContainer container = builder.Build(); 

// get the profile lifetimescope 
ILifetimeScope profileScope = container.ResolveNamed<ILifetimeScope>("B"); 

// use a working lifetimescope from your profile 
using (ILifetimeScope workingScope = profileScope.BeginLifetimeScope()) 
{ 
    IFoo foo = workingScope.Resolve<IFoo>(); 
    Console.WriteLine(foo.GetType()); 
} 

Par ailleurs, soyez prudent ne pas utiliser ce code comme un service locator anti pattern

+0

Bonjour Cyril, je crois qu'il y a une différence entre les conteneurs enfants et imbriqués dans StructureMap comme indiqué dans la documentation -> Les conteneurs enfants ne sont pas interchangeables avec les conteneurs imbriqués. Voir Conteneurs imbriqués (par demande/transaction) pour plus d'informations sur les conteneurs imbriqués. – CRG

+0

Cependant le réenregistrement avec un nouveau LifetimeScope devrait fonctionner. Merci pour vos commentaires! – CRG