首页 > 解决方案 > ASP.NET Core:带条件的 DI 服务

问题描述

我想在 Startup 中注册我的服务类 ADManager。但是该类在构造函数中有一个字符串参数,并且实例化取决于用户是否与 webb 应用程序在同一个域中。

// Constructor
public ADManager(
    string ADDomain, bool isSameDomain = true,
    string username = null, string password = null) 

如果是同一个域,这是我手动创建类实例的方法:

var adManager = new ADManager(_authenticationSettings.AdDomain, _isSameDomain);

但是如果 _isSameDomain 等于 false 那么它必须像这样创建:

var adManager = new ADManager(
    _authenticationSettings.AdDomain, _isSameDomain, Input.Username, Input.Password);

标签: c#dependency-injectionasp.net-core-2.2

解决方案


您需要使用AddScoped. 您作为工厂传递的 lambda 将在每次实例化服务时运行,在作用域生命周期中,这将大致是每个请求。

services.AddScoped<ADManager>(p =>
{
    // use `p` to get any other services, i.e. `p.GetRequiredService<Foo>()`
    return new ADManager(...);
});

请注意,虽然在正常操作中,应该始终有一个关联的请求,但根据您使用服务的方式,它可能会在请求管道之外运行。例如,如果您试图以单例方式将其拉出:

using (var scope = _serviceProvider.CreateScope())
{
    var adManager = scope.ServiceProvider.GetRequiredService<ADManager>();
    // HttpContext could be null in this scope
}

推荐阅读