gpt4 book ai didi

dependency-injection - 我应该注入(inject)哪些依赖项?

转载 作者:行者123 更新时间:2023-12-04 08:21:26 25 4
gpt4 key购买 nike

当使用依赖注入(inject)时,你注入(inject)了哪些依赖?

我之前注入(inject)了所有依赖项,但在执行 TDD 时发现通常有两种类型的依赖项:

  • 那些可能会改变的真正的外部依赖项,例如产品库
  • 那些纯粹是为了可测试性而存在的,例如为可测试性而提取和注入(inject)的类的部分行为

  • 一种方法是像这样注入(inject)所有依赖项
    public ClassWithExternalDependency(IExternalDependency external,
    IExtractedForTestabilityDependency internal)
    {
    // assign dependencies ...
    }

    但我发现这会导致 DI 注册表中的依赖项膨胀。

    另一种方法是像这样隐藏“可测试性依赖”
    public ClassWithExternalDependency(IExternalDependency external)
    : this (external, new ConcreteClassOfInternalDependency())
    {}

    internal ClassWithExternalDependency(IExternalDependency external,
    IExtractedForTestabilityDependency internal)
    {
    // assign dependencies ...
    }

    这是更多的努力,但似乎更有意义。缺点是并非所有对象都在 DI 框架中配置,从而打破了我听说过的“最佳实践”。

    你会提倡哪种方法,为什么?

    最佳答案

    我相信您最好注入(inject)所有依赖项。如果它开始变得有点笨拙,这可能表明您需要稍微简化一些事情或将依赖关系移动到另一个对象中。感受你设计的“痛苦”真的很有启发性。

    至于注册表中的依赖膨胀,您可以考虑使用某种传统的绑定(bind)技术,而不是手动注册每个依赖。一些 IoC 容器内置了基于约定的类型扫描绑定(bind)。例如,这是我在使用 Ninject 的 Caliburn WPF 应用程序中使用的模块的一部分:

    public class AppModule : NinjectModule
    {
    public override void Load()
    {
    Bind<IShellPresenter>().To<ShellPresenter>().InSingletonScope();

    BindAllResults();
    BindAllPresenters();
    }

    /// <summary>
    /// Automatically bind all presenters that haven't already been manually bound
    /// </summary>
    public void BindAllPresenters()
    {
    Type[] types = Assembly.GetExecutingAssembly().GetTypes();

    IEnumerable<Type> presenterImplementors =
    from t in types
    where !t.IsInterface
    && t.Name.EndsWith("Presenter")
    select t;

    presenterImplementors.Run(
    implementationType =>
    {
    if (!Kernel.GetBindings(implementationType).Any())
    Bind(implementationType).ToSelf();
    });
    }

    即使我有几十个结果和演示者跑来跑去,我也不必明确地注册它们。

    关于dependency-injection - 我应该注入(inject)哪些依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4136999/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com