Unity DI,多个命名实例

Unity DI, multiple named instances

我对我的问题有这个简化的结构。我有多个命名实例,正如您所看到的,IBusinessLogic 的注册数量随着每个添加的参数而增加。有没有优雅的方法可以实现下面的目标而不需要为 IBusinessLogic 设置这么多 RegisterType。

class Program
{
    static void Main(string[] args)
    {
        IUnityContainer container = new UnityContainer();
        container.RegisterType<ISettings, Settings1>("settings1");
        container.RegisterType<ISettings, Settings2>("settings2");

        container.RegisterType<IRepository, Repository1>("repository1 settings1", new InjectionConstructor(new ResolvedParameter<ISettings>("settings1")));
        container.RegisterType<IRepository, Repository1>("repository1 settings2", new InjectionConstructor(new ResolvedParameter<ISettings>("settings2")));
        container.RegisterType<IRepository, Repository1>("repository2 settings1", new InjectionConstructor(new ResolvedParameter<ISettings>("settings1")));
        container.RegisterType<IRepository, Repository1>("repository2 settings2", new InjectionConstructor(new ResolvedParameter<ISettings>("settings2")));

        container.RegisterType<IBusinessLogic, BusinessLogic1>("logic1 settings1 repository1", new InjectionConstructor(new ResolvedParameter<ISettings>("settings1"), new ResolvedParameter<IRepository>("repository1 settings1")));
        container.RegisterType<IBusinessLogic, BusinessLogic1>("logic1 settings2 repository1", new InjectionConstructor(new ResolvedParameter<ISettings>("settings2"), new ResolvedParameter<IRepository>("repository1 settings1")));

        container.RegisterType<IBusinessLogic, BusinessLogic1>("logic1 settings1 repository2", new InjectionConstructor(new ResolvedParameter<ISettings>("settings1"), new ResolvedParameter<IRepository>("repository2 settings2")));
        container.RegisterType<IBusinessLogic, BusinessLogic1>("logic1 settings2 repository2", new InjectionConstructor(new ResolvedParameter<ISettings>("settings2"), new ResolvedParameter<IRepository>("repository2 settings2")));

        container.RegisterType<IBusinessLogic, BusinessLogic2>("logic2 settings1 repository1", new InjectionConstructor(new ResolvedParameter<ISettings>("settings1"), new ResolvedParameter<IRepository>("repository1 settings1")));
        container.RegisterType<IBusinessLogic, BusinessLogic2>("logic2 settings2 repository1", new InjectionConstructor(new ResolvedParameter<ISettings>("settings2"), new ResolvedParameter<IRepository>("repository1 settings1")));

        container.RegisterType<IBusinessLogic, BusinessLogic2>("logic2 settings1 repository2", new InjectionConstructor(new ResolvedParameter<ISettings>("settings1"), new ResolvedParameter<IRepository>("repository2 settings2")));
        container.RegisterType<IBusinessLogic, BusinessLogic2>("logic2 settings2 repository2", new InjectionConstructor(new ResolvedParameter<ISettings>("settings2"), new ResolvedParameter<IRepository>("repository2 settings2")));

        string inputParam1 = "logic1";
        string inputParam2 = "settings2";
        string inputParam3 = "repository1";

        var instance = container.Resolve<IBusinessLogic>(inputParam1 + " " + inputParam2 + " " + inputParam3);
    }
}

编辑:

我找到了替代方法,但我必须在依赖关系图中明确指定每个覆盖

class Program
{
    static void Main(string[] args)
    {
        IUnityContainer container = new UnityContainer();
        container.RegisterType<ISettings, Settings1>("settings1");
        container.RegisterType<ISettings, Settings2>("settings2");

        container.RegisterType<IRepository, Repository1>("repository1");
        container.RegisterType<IRepository, Repository2>("repository2");

        container.RegisterType<IBusinessLogic, BusinessLogic1>("logic1");
        container.RegisterType<IBusinessLogic, BusinessLogic2>("logic2");

        string inputParam1 = "logic1";
        string inputParam2 = "settings1";
        string inputParam3 = "repository1";

        var instance = container.Resolve<IBusinessLogic>(inputParam1, new DependencyOverrides()
            {
                {typeof(ISettings),container.Resolve<ISettings>(inputParam2)},
                {typeof(IRepository),container.Resolve<IRepository>(inputParam3, new DependencyOverrides() 
                    { 
                        {typeof(ISettings),container.Resolve<ISettings>(inputParam2)} 
                    })
                 },
            });
    }
}

我真正需要的是告诉容器 - 解析 IBusinessLogic 并在需要 ISettings 实例的依赖关系图中的任何地方使用 "settings1" 命名实例。这可能吗?

以下是您的操作方法:

IUnityContainer container = new UnityContainer();
container.RegisterType<ISettings, Settings1>("settings1");
container.RegisterType<ISettings, Settings2>("settings2");

container.RegisterType<IRepository, Repository1>("repository1");
container.RegisterType<IRepository, Repository2>("repository2");

container.RegisterType<IBusinessLogic, BusinessLogic1>("logic1");
container.RegisterType<IBusinessLogic, BusinessLogic2>("logic2");

string inputParam1 = "logic1";
string inputParam2 = "settings1";
string inputParam3 = "repository1";

var result = container.Resolve<IBusinessLogic>(inputParam1,
    new DependencyOverride<ISettings>(new ResolvedParameter<ISettings>(inputParam2)),
    new DependencyOverride<IRepository>(new ResolvedParameter<IRepository>(inputParam3)));