ASP.NET Core:附带条件的DI服务

时间:2019-05-14 11:02:28

标签: c# dependency-injection asp.net-core-2.2

我想在启动中注册我的服务类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);

1 个答案:

答案 0 :(得分:1)

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