ASP.NET 核心:有条件的 DI 服务

ASP.NET Core: DI Service with conditions

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

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

以下是我如何手动创建 class 的实例,如果是同一个域:

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

但如果 _isSameDomain 等于 false,则必须像这样创建它:

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

您需要使用 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
}