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
pourriez-vous expliquer brièvement ce que font les profils? –
Les profils permettent à la structure des graphes d'objet de changer en fonction des conditions d'exécution (le nom du profil). – Steven