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)));
我对我的问题有这个简化的结构。我有多个命名实例,正如您所看到的,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)));