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