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
}
我想在 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
}