c# - 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);
解决方案
您需要使用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
}
推荐阅读
- python - 将 django 过滤器编译成变量并在运行时执行?
- javascript - 在不刷新网页的情况下为进度条设置动画
- sql - Sql 触发器在可以引用之前更新表
- string - 在 Alteryx 中将填充字符串转换为固定十进制
- rest - 验证 REST API 的 HTTP POST 请求正文
- python - 测试 Django-Rest 自定义字段
- python - python,找到两个不相等列表之间的区别
- mongodb - 无法使用现有索引对 mongodb 集合进行分片。获取“找不到分片键的有效索引”
- c++11 - 如果构造函数取值,为什么我需要移动构造函数
- python-3.x - pip - 安装特定的软件包版本不起作用