【问题标题】:ASP.NET Core Dependency Injection Evaluation of Tree树的 ASP.NET Core 依赖注入评估
【发布时间】:2018-04-15 19:31:48
【问题描述】:

是否有一种简单的方法可以评估依赖项在 DI 容器中对于给定服务或所有服务是否可用? (特别是在构建时)

我有几个 Azure Functions 正在运行,我手动构建了 DI 容器以将内容保持在最低限度,当依赖关系树发生变化时,我必须记住将新的依赖关系添加到函数中。如果我没有在函数第一次执行时出现错误,而不是在我构建它以重新发布时。

是否有最佳实践可以遵循?可以通过某种单元测试来实现吗?

【问题讨论】:

    标签: asp.net-core dependency-injection


    【解决方案1】:

    我认为没有办法在构建时验证这一点,但正如您所建议的,如果您遵循通常的扩展方法来注册您的服务,则可以通过单元测试来验证这一点。安排应注册的类型列表,调用您的 reg 扩展,并验证内容。我认为您唯一不能做的就是确认他们已在正确的生命周期内注册。

    public static IServiceCollection AddFunctionsServices(this IServiceCollection services)
    {
        return services
            .AddTransient<Foo>()
            .AddTransient<Bar>()
            .AddTransient<Baz>();
    }
    
    [Fact]
    public void RegisteredServices()
    {
        var types = new List<Type>{ typeof(Foo), typeof(Bar), typeof(Baz) };
        var provider = new ServiceCollection()
            .AddFunctionsServices()
            .AddSomeOtherServices()
            .BuildServiceProvider();
    
        foreach(var t in types)
            Assert.NotNull(provider.GetService<t>());
    }
    

    如果注册发生在由不同应用程序使用的单独库中(实际上我自己使用支持函数、Web 应用程序和命令行实用程序的库执行此操作),您可以轻松地为所需服务列表设置不同的测试由每个图书馆消费者提供。

    【讨论】:

    • 谢谢,这就是我的想法。问题在于它仍然需要我“知道”具有更新依赖项的服务所在的所有位置。假设我有一个名为 IService1 的服务,并且我刚刚在 IService2 的该服务实现的构造函数中添加了一个新依赖项,我必须手动找到它在函数 1、3、5 中使用并更新它们的依赖项。我希望有人可能知道一种方法来测试每个服务的树是否没有更改为现在缺少某些东西的状态。
    • 我自己使用 DI 和 Functions 也经历了同样的过程。问题是,注册服务既快捷又便宜。服务在被请求之前不会被创建,因此仔细修剪每个 Functions 应用程序的列表最终会被浪费在过早的优化上。我有两个不同的 Functions 用例,所以我最终得到了整个系统的 AddFunctionsServicesAddFunctionsParserServicesAddAspNetCoreServicesAddMaintenanceServices(用于命令行实用程序)扩展。
    • 所以基本上我应该使用我在我的网络应用程序中使用的相同方法注册它们,而且开销是如此之小,我只是很挑剔? :)
    • 当然,如果您全部使用它们。如您所见,我仍然区分,但不是基于单个功能。我应该注意到,这些“顶级”扩展中的每一个都调用不同的附加服务注册扩展,在某些情况下,甚至还有第三层混合在一起——我绝对知道多重依赖组合的痛苦,我打算自己实现这个单元测试方法......
    猜你喜欢
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多