Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将参数传递给已具有依赖项注入的服务_C#_Asp.net Core - Fatal编程技术网

C# 将参数传递给已具有依赖项注入的服务

C# 将参数传递给已具有依赖项注入的服务,c#,asp.net-core,C#,Asp.net Core,我有一个具有以下构造函数的服务 public TokenService(UserManager<IdentityUser> userManager, ApplicationDbContext dbContext) { _userManager = userManager; _dbContext = dbContext; } 公共令牌服务(UserManager UserManager,A

我有一个具有以下构造函数的服务

        public TokenService(UserManager<IdentityUser> userManager, ApplicationDbContext dbContext)
        {
            _userManager = userManager;
            _dbContext = dbContext;
        }
公共令牌服务(UserManager UserManager,ApplicationDbContext dbContext)
{
_userManager=userManager;
_dbContext=dbContext;
}
在Startup.cs中,我注册了服务:

     services.AddScoped<TokenService>();
services.addScope();
我想向构造函数添加一个字符串参数,并将该字符串传递给我在Startup.cs中注册服务的服务

我知道可以通过在注册期间创建新实例来传递参数,但我不知道手动传递UserManger和ApplicationDbContext对象时如何传递

如果我这样做:

services.AddScoped<>(_ => new TokenService(null , null, "secret");
services.AddScoped(=>newtokenservice(null,null,“secret”);
它不适用于其他服务的依赖注入


作为一种解决方法,我在Program.cs中添加了带有方法的字符串,但希望删除该字符串。

通常,当您想为同样需要注入依赖项的内容提供参数时,您会创建一个工厂。但是,在这种情况下,由于参数在注册过程中已知,您可以轻松地在g直接使用工厂方法:

services.AddSingleton(serviceProvider => new TokenService(serviceProvider.GetRequiredService<UserManager<IdentityUser>>(), serviceProvider.GetRequiredService<ApplicationDbContext>(), "hello"));
services.AddSingleton(serviceProvider=>newtokenservice(serviceProvider.GetRequiredService(),serviceProvider.GetRequiredService(),“hello”);
在您的评论中,您声明这不能是单例,这与工厂方法无关,就像注册瞬态一样简单,例如:

services.AddTransient(serviceProvider => new TokenService(serviceProvider.GetRequiredService<UserManager<IdentityUser>>() , serviceProvider.GetRequiredService<ApplicationDbContext>(), "hello"));
services.AddTransient(serviceProvider=>newtokenservice(serviceProvider.GetRequiredService(),serviceProvider.GetRequiredService(),“hello”);

希望这有助于

通常,当您想为同样需要注入依赖项的内容提供参数时,您最终会创建一个工厂。但是在这种情况下,由于参数在注册过程中是已知的,您可以轻松地直接注册工厂方法:

services.AddSingleton(serviceProvider => new TokenService(serviceProvider.GetRequiredService<UserManager<IdentityUser>>(), serviceProvider.GetRequiredService<ApplicationDbContext>(), "hello"));
services.AddSingleton(serviceProvider=>newtokenservice(serviceProvider.GetRequiredService(),serviceProvider.GetRequiredService(),“hello”);
在您的评论中,您声明这不能是单例,这与工厂方法无关,就像注册瞬态一样简单,例如:

services.AddTransient(serviceProvider => new TokenService(serviceProvider.GetRequiredService<UserManager<IdentityUser>>() , serviceProvider.GetRequiredService<ApplicationDbContext>(), "hello"));
services.AddTransient(serviceProvider=>newtokenservice(serviceProvider.GetRequiredService(),serviceProvider.GetRequiredService(),“hello”);

希望这有助于现在写不出正确的答案,但我有一个模糊的记忆,你可以告诉DI如何构造一些东西……这是,或者类似的东西:
services.addSingleton(=>newTokenService(null,null,“hello”))
我不得不从Singleton改为Scoped来使用UserManager,你给我的这段代码可以编译,但是当我尝试使用该服务时UserManager是空的。啊,是的,因为你现在显式地用空值构造它。接受的答案是正确的。现在无法编写正确的答案,但我有一个模糊的内存,你可以告诉我l DI如何构造一些东西……这个,或者类似的东西:
services.addSingleton(=>newtokenservice(null,null,“hello”))
我不得不从Singleton改为Scoped来使用UserManager,你给我的这段代码可以编译,但是当我尝试使用该服务时UserManager是空的。啊,是的,因为你现在显式地用空值构造它。接受的答案是正确的。是的,这是可行的,起初我想知道是什么错了,但应该是这样的:services.AddTransient(serviceProvider=>newtokenservice(serviceProvider.GetRequiredService(),serviceProvider.GetRequiredService(),“hello”);是的,这是可行的,起初我想知道是怎么回事,但应该是这样的:services.AddTransient(serviceProvider=>newtokenservice(serviceProvider.GetRequiredService(),serviceProvider.GetRequiredService(),“你好”);