dependency-injection - 防止解析未注册的类

标签 dependency-injection inversion-of-control unity-container

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);
    }
}

关于dependency-injection - 防止解析未注册的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46595903/

相关文章:

c# - 当基类中只需要依赖时,在基类中使用属​​性注入(inject)是否合适?

c# - 如何使用 IoC 注入(inject)打开的连接

c# - 依赖注入(inject)(使用 SimpleInjector)和 OAuthAuthorizationServerProvider

javascript - AngularJS错误: $injector:unpr Unknown Provider githubProvider <- github <- MainController

java - 如何通过classes.methods调用来模仿@Inject?

asp.net-mvc - Linq to SQL DataContext Windsor IoC内存泄漏问题

java - 来自 Guice 的 "Please wait until after injection has completed to use this object"错误

WCF 和容器生命周期

c# - 如何在 .NET 应用程序中松耦合数据库列?

dependency-injection - 我应该在哪里存储对我的 DI 容器的引用?