Unity - 带有重写参数的链式依赖项

时间:2017-04-04 14:25:13

标签: c# unity-container

我需要覆盖链式依赖项的参数。我的重写参数必须传递给第一个和第二个实例化的类。

所以我的客户端类需要一个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));

1 个答案:

答案 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>()之前完成注册的第二部分,它就会很好地解决。