unity select 不同的注塑厂

Unity select a different injection factory

我想为同一个类型注册两个不同的Injection factory,例如可以是下面这两个注册。

        container.RegisterType<BaseSearchProvider>(
                new HierarchicalLifetimeManager(),       
                 new InjectionFactory(c =>ExamineManager.Instance.SearchProviderCollection["Setting 1"]));


        container.RegisterType<BaseSearchProvider>(
            new HierarchicalLifetimeManager(),
            new InjectionFactory(c => ExamineManager.Instance.SearchProviderCollection["Setting 2"]));

现在,对于每个类型,我手动注册我的构造。我有不同的服务,但有些服务需要使用第一次注册,而其他服务需要第二次注册?有什么办法可以通过使用像这样的 "Profile" 来执行此操作吗?

       container.RegisterType<IMeetingSearchService>("using Setting 1")

我现在唯一能想到的解决方案是继承 BaseSearchProvider 并注册这种类型,这样我就可以注册两种不同的类型并用它来调整我所有的构造函数,所以我什至不需要那个选择器。但也许还有另一种方法?

有一种方法可以按名称解析。

因此您需要两种不同的派生类型的 BaseSearchProvider。让我们称呼他们:

SettingsOneSearchProvider & SettingsTwoSearchProvider

现在我们可以通过在两个新提供程序的构造函数中使用 'ExamineManager.Instance.SearchProviderCollection["settingsname"]' 代码来获得正确的设置。

在您的注册中 class 您可以像这样在注册中添加名称:

container.RegisterType<BaseSearchProvider, SettingsOneSearchProvider>("SettingsOne"
        new HierarchicalLifetimeManager(),       
        new InjectionFactory(c =>ExamineManager.Instance.SearchProviderCollection["Setting 1"]));


container.RegisterType<BaseSearchProvider, SettingsTwoSearchProvider>("SettingsOne"
        new HierarchicalLifetimeManager(),
        new InjectionFactory(c => ExamineManager.Instance.SearchProviderCollection["Setting 2"]));

现在我们在注册中需要一个额外的解析方法class来按名称解析:

public static T Resolve<T>(string name)
{
    return container.Resolve<T>(name);
}

现在您可以使用以下代码解决两者之一:

var provider = RegistationClassName.Resolve<BaseSearchProvider>("SettingsOne");