Unity will resolve classes even if they are not registered in the container. Is it possible to change container configuration so classes should be explicitly registered to be resolved?
You can create custom builder strategy and check if type is registered in container:
class Program
{
static void Main(string[] args)
{
var container = new UnityContainer();
container.AddNewExtension<FactoryUnityExtension>();
try
{
container.Resolve<Program>();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
container.RegisterType<Program>();
var v = container.Resolve<Program>();
Console.WriteLine(v);
}
}
public class CustomFactoryBuildStrategy : BuilderStrategy
{
private ExtensionContext baseContext;
public CustomFactoryBuildStrategy(ExtensionContext baseContext)
{
this.baseContext = baseContext;
}
public override void PreBuildUp(IBuilderContext context)
{
var key = (NamedTypeBuildKey)context.OriginalBuildKey;
if (baseContext.Container.Registrations.All(o => o.RegisteredType != key.Type))
{
throw new InvalidOperationException();
}
}
}
public class FactoryUnityExtension : UnityContainerExtension
{
private CustomFactoryBuildStrategy strategy;
protected override void Initialize()
{
this.strategy = new CustomFactoryBuildStrategy(Context);
Context.Strategies.Add(strategy, UnityBuildStage.PreCreation);
}
}