zenJect

Zenject框架(三)

2019-03-11  本文已影响0人  虫小白

绑定

每个依赖注入框架最终只是一个将类型绑定到实例的框架。

在Zenject中,依赖关系映射是通过向容器(container)中添加绑定来完成的。然后,容器应该通过递归地解析给定对象的所有依赖项来“知道”如何在应用程序中创建所有对象实例。

当要求容器构造给定类型的实例时,它使用C#的反射来查找构造函数参数列表以及使用[Inject]属性标记的所有字段/ 属性。然后,它尝试解析每个必需的依赖项,用于调用构造函数并创建新实例。

因此,每个使用Zenject的应用程序必须告诉容器如何解析这些依赖关系,这是通过Bind命令完成的。例如,给定以下类:

public class Foo
{
    IBar _bar;

    public Foo(IBar bar)
    {
        _bar = bar;
    }
}

你可以通过下面的方式为该类绑定依赖项:

Container.Bind<Foo>().AsSingle();
Container.Bind<IBar>().To<Bar>().AsSingle();

这会告诉Zenject每个使用Foo依赖项的类都使用同一个实例,该实例会在需要的时候自动创建。同样的,每个依赖IBar接口的类(比如Foo)都使用同一个Bar类型的实例。
绑定命令的完整格式如下。请注意,在大多数情况下,您不会使用所有这些方法,在未指定时它们都具有逻辑默认值

Container.Bind<ContractType>()
    .WithId(Identifier)
    .To<ResultType>()
    .FromConstructionMethod()
    .AsScope()
    .WithArguments(Arguments)
    .OnInstantiated(InstantiatedCallback)
    .When(Condition)
    .(Copy|Move)Into(All|Direct)SubContainers()
    .NonLazy()
    .IfNotBound();

在这里:

Container.Bind<Foo>().AsSingle().OnInstantiated<Foo>(OnFooInstantiated);

void OnFooInstantiated(InjectContext context, Foo foo)
{
    foo.Qux = "asdf";
}

或等效的

Container.Bind<Foo>().AsSingle().OnInstantiated<Foo>((ctx, foo) => foo.Bar = "qux");

请注意,您也可以使用FromFactory绑定自定义工厂,直接调用Container.InstantiateX,然后再调整它以获得相同的效果,但OnInstantiated在某些情况下可能更容易

Container.Bind<Foo>().AsSingle().CopyIntoAllSubContainers()

换句话说,结果将等同于将Container.Bind<Foo>().AsSingle()语句复制并粘贴到每个子容器的安装程序中。
或者,如果您只想在子容器而不是当前容器中使用Foo的实例:

Container.Bind<Foo>().AsSingle().MoveIntoAllSubContainers()

或者,如果您只希望在直接子子容器而不是这些子容器的子容器中使用Foo实例:

Container.Bind<Foo>().AsSingle().MoveIntoDirectSubContainers()
上一篇 下一篇

猜你喜欢

热点阅读