Dependency injection 防止解析未注册的类

Dependency injection 防止解析未注册的类,dependency-injection,inversion-of-control,unity-container,Dependency Injection,Inversion Of Control,Unity Container,Unity将解析类,即使它们未在容器中注册。是否可以更改容器配置,以便显式注册类以进行解析?您可以创建自定义生成器策略,并检查容器中是否注册了类型: class Program { static void Main(string[] args) { var container = new UnityContainer(); container.AddNewExtension<FactoryUnityExtension>();

Unity将解析类,即使它们未在容器中注册。是否可以更改容器配置,以便显式注册类以进行解析?

您可以创建自定义生成器策略,并检查容器中是否注册了类型:

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);
    }
}
类程序
{
静态void Main(字符串[]参数)
{
var container=new UnityContainer();
container.AddNewExtension();
尝试
{
container.Resolve();
}
捕获(例外情况除外)
{
控制台写入线(例如消息);
}
container.RegisterType();
var v=container.Resolve();
控制台写入线(v);
}
}
公共类CustomFactoryBuildStrategy:BuilderStrategy
{
专用扩展上下文baseContext;
公共CustomFactoryBuildStrategy(扩展上下文baseContext)
{
this.baseContext=baseContext;
}
公共覆盖无效预构建(IBuilderContext上下文)
{
var key=(NamedTypeBuildKey)context.OriginalBuildKey;
if(baseContext.Container.Registrations.All(o=>o.RegisteredType!=key.Type))
{
抛出新的InvalidOperationException();
}
}
}
公共类FactoryUnityExtension:UnityContainerExtension
{
私人客户工厂建设战略;
受保护的覆盖无效初始化()
{
this.strategy=新CustomFactoryBuildStrategy(上下文);
Context.Strategies.Add(strategy,UnityBuildStage.PreCreation);
}
}

@ArturShamsutdinov您尝试过这个解决方案吗?