Gibt es eine Weise, die ich entweder eine andere Standard Lebensdauer Manager
Ja, können Sie einen Container-Erweiterung verwenden, die eine andere Lebensdauer Manager angeben verwenden. Ein Beispiel finden Sie unter Request for configurable default lifetimemanager.
oder das Standard-Auto-Auflösung Verhalten vollständig deaktivieren und begrenzen die Container-Typen I registriere ich
Ja, eine Container-Erweiterung dies auch tun können.
Zuerst während der expliziten Registrierung den BuildKey der Registrierung aufzeichnen. Überprüfen Sie dann vor dem Erstellen des Objekts, ob der BuildKey explizit registriert wurde.
public class RegistrationTrackingExtension : UnityContainerExtension
{
private ConcurrentDictionary<NamedTypeBuildKey, bool> registrations =
new ConcurrentDictionary<NamedTypeBuildKey, bool>();
protected override void Initialize()
{
base.Context.Registering += Context_Registering;
base.Context.Strategies.Add(
new ValidateRegistrationStrategy(this.registrations), UnityBuildStage.PreCreation);
}
private void Context_Registering(object sender, RegisterEventArgs e)
{
var buildKey = new NamedTypeBuildKey(e.TypeTo, e.Name);
this.registrations.AddOrUpdate(buildKey, true, (key, oldValue) => true);
}
public class ValidateRegistrationStrategy : BuilderStrategy
{
private ConcurrentDictionary<NamedTypeBuildKey, bool> registrations;
public ValidateRegistrationStrategy(ConcurrentDictionary<NamedTypeBuildKey, bool> registrations)
{
this.registrations = registrations;
}
public override void PreBuildUp(IBuilderContext context)
{
if (!this.registrations.ContainsKey(context.BuildKey))
{
Exception e = new Exception("Type was not explicitly registered in the container.");
throw new ResolutionFailedException(context.BuildKey.Type, context.BuildKey.Name, e, context);
}
}
}
}
Dann fügen Sie die Erweiterung hinzu, registrieren Sie einige Klassen und beheben Sie. Wenn die Klasse nicht explizit registriert wurde, wird eine Ausnahme ausgelöst.
IUnityContainer container = new UnityContainer();
// Add container extension
container.AddNewExtension<RegistrationTrackingExtension>();
// Register types
container.RegisterType<MyClass>();
container.RegisterType<IMyClass, MyClass>();
container.RegisterType<IMyClass, MyClass>("A");
// These succeed because they were explicitly registered
container.Resolve<IMyClass>();
container.Resolve<IMyClass>("A");
container.Resolve<MyClass>();
// MyClass2 was not registered so this will throw an exception
container.Resolve<MyClass2>();
Mögliche Duplikat von http://StackOverflow.com/Questions/29828410/default-the-Lifetimemanager-to-the-Singleton-Manager-ContainerControlledLifetim – gastonmancini
Great; das scheint mir eine Möglichkeit zu geben, den Standard 'LifetimeManager' einzustellen. Ich würde immer noch gerne wissen, ob es eine Möglichkeit gibt, die automatische/implizite Registrierung zu deaktivieren. – dlf