我需要覆盖链式依赖项的参数。我的重写参数必须传递给第一个和第二个实例化的类。
所以我的客户端类需要一个IA
的实例,其中包含一个自定义env
参数(启动时不知道)。 IA
的构造函数需要具有相同自定义IB
参数的env
实例。
所以这是我的两个类的代码:
class A : IA
{
IB _b;
AppEnv _env;
public A(IB b, AppEnv env)
{
_b = b;
_env = env;
}
void DoStuff();
}
class B : IB
{
AppEnv _env;
public A(AppEnv env)
{
_env = env;
}
void DoStuff();
}
以下是我的客户代码:
var env = new... // "good" env, with runtime values
var a = container.Resolve<IA>(new ParameterOverride("env", env));
IA
的实例具有“良好”env
参数。但是如何将此参数传递给IB
的实例?
我的Unity配置如下所示:
var defaultEnv = new ... // default env object
container.RegisterType<IB, B>(new InjectionConstructor(defaultEnv));
container.RegisterType<IA, A>(new InjectionConstructor(defaultEnv));
答案 0 :(得分:2)
如果您不想更改继承,我认为您不应该对Unity中的InjectionConstructor
使用静态解析。我会选择ResolvedParameter
:
// At "Startup"
container.RegisterType<IA, A>(
new InjectionConstructor(
new ResolvedParameter<AppEnv>("JustANameIfYouHaveMany")));
container.RegisterType<IB, B>(
new InjectionConstructor(
new ResolvedParameter<AppEnv>("JustANameIfYouHaveMany")));
// Whenever you can get the proper value of AppEnv
AppEnv correctValue = AppEnv.WhateverLogic();
container.RegisterInstance<AppEnv>("JustANameIfYouHaveMany", correctValue);
根据我所写的内容,您可以尽早进行启动注册,但只要您在container.Resolve<IA or IB>()
之前完成注册的第二部分,它就会很好地解决。