请建议我如何解决以下问题:
我有一堂课:
public class Module
{
public Module(Uri param1, Uri param2)
{
}
}
此类型在 Unity Container 中注册:
container.RegisterInstance<Uri>("uri1", new Uri("http://sample-1.com"));
container.RegisterInstance<Uri>("uri2", new Uri("http://sample-2.com"));
container.RegisterType<Module>(
new InjectionConstructor(
new ResolvedParameter<Uri>("uri1"),
new ResolvedParameter<Uri>("uri2")));
通过这种方式,我建立了对 Uri 不同实例的不同构造函数参数的依赖。
我想在解析模块实例时覆盖这个值。
我可以按类型覆盖:
container.Resolve<Module>(
new DependencyOverride(typeof(Uri), new Uri("http://overriden.com")))
我也可以通过 custructor 参数覆盖。
container.Resolve<Module>(
new ParameterOverride("param1", new Uri("http://param1.org"))
new ParameterOverride("param2", new Uri("http://param2.com")))
但是:我不知道如何根据类型注册的名称按类型覆盖。因此,DependencyOverride 没有任何额外的参数来覆盖并非所有类型,也不能使用命名注册。
因此,我想要以下内容:
container.Resolve<Module>(
new DependencyOverride("uri1", typeof(Uri), new Uri("http://overriden-1.com")),
new DependencyOverride("uri2", typeof(Uri), new Uri("http://overriden-2.com")));
其中第一个参数 (uri1 & uri2) 是在初始注册时使用 ResolvedParameter("uri1") 和 ResolvedParameter("uri2") 注册类型时用于构建依赖项的名称。
请建议我,如何在不定义构造函数参数名称的情况下从容器解析模块时覆盖。
PS我为什么要走这条路?因为我不想依赖于参数的名称,所以有人可以重命名它们,并且依赖关系树会损坏。另外,我不想依赖于 Module 的注册方式,如果 Module 有多个构造函数,则选择哪种构造函数。
UPD:我找到了临时解决方案,但这只是一种解决方法,因为它破坏了生命周期管理器,例如 PerResolveLifetimeManager,因为我们将 Module1 和 Module2 与控制器分开解析,它们依赖于 Module1 和 Module2。
var m1 = _container.Resolve<IModule1>(
new DependencyOverride(typeof(HttpControllerContext), context),
new DependencyOverride(typeof(Uri), new Uri("http://module-1.com/")));
var m2 = _container.Resolve<IModule2>(
new DependencyOverride(typeof(HttpControllerContext), context),
new DependencyOverride(typeof(Uri), new Uri("http://m-2.com/")));
var dependency = new ResolverOverride[]
{
new DependencyOverride(typeof(HttpControllerContext), context),
new DependencyOverride(typeof(IModule1), m1),
new DependencyOverride(typeof(IModule2), m2)
};
var controller = _container.Resolve(controllerType, dependency) as IHttpController;
return controller;