Is there a way to specify a different default life manager
Yes, you can use a container extension that another lifetime manager will use. For an example, see Requesting a Custom Standard lifetimemanager .
or completely disable the default automatic resolution behavior and restrict the container to the types that I register myself
Yes, container extension can also do this.
First, during the explicit registration record of the BuildKey registration. Then, before creating the object, check if there was an explicit BuildKey registration.
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); } } } }
Then add the extension, register some classes and decide. If the class has not been explicitly registered, an exception is thrown.
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>();
Randy levy
source share