我有一个具有以下构造函数的服务
public TokenService(UserManager<IdentityUser> userManager, ApplicationDbContext dbContext)
{
_userManager = userManager;
_dbContext = dbContext;
}
在启动中.cs我已经注册了服务:
services.AddScoped<TokenService>();
我想向构造函数添加一个字符串参数,并将字符串传递给我在 Startup 中注册服务的服务.cs
我知道您可以通过在注册期间创建新实例来传递参数,但我不知道在手动执行此操作时如何传递 UserManger 和 ApplicationDbContext 对象。
如果我这样做:
services.AddScoped<>(_ => new TokenService(null , null, "secret");
它不适用于其他服务的依赖项注入。
作为一种解决方法,我在程序中添加了带有方法的字符串.cs但想删除它。
通常,当您想为也需要注入依赖项的东西提供参数时,您最终会创建一个工厂。但是,在这种情况下,由于参数在注册期间是已知的,因此您可以轻松解决此问题,直接注册工厂方法:
services.AddSingleton(serviceProvider => new TokenService(serviceProvider.GetRequiredService<UserManager<IdentityUser>>(), serviceProvider.GetRequiredService<ApplicationDbContext>(), "hello"));
在您的评论中,您指出这不能是单例,这与工厂方法无关紧要,就像注册瞬态一样容易,例如:
services.AddTransient(serviceProvider => new TokenService(serviceProvider.GetRequiredService<UserManager<IdentityUser>>() , serviceProvider.GetRequiredService<ApplicationDbContext>(), "hello"));
希望这有帮助