我需要在我的Startup类中实例化的Singleton类中访问我的数据库.似乎直接注入它会导致处理掉的DbContext.
我收到以下错误:
无法访问已处置的对象.对象名称:'MyDbContext'.
我的问题有两个:为什么这不起作用,如何在单例类实例中访问我的数据库?
这是我的Startup类中的ConfigureServices方法:
public void ConfigureServices(IServiceCollection services)
{
// code removed for brevity
services.AddEntityFramework().AddSqlServer().AddDbContext<MyDbContext>(
options =>
{
var config = Configuration["Data:DefaultConnection:ConnectionString"];
options.UseSqlServer(config);
});
// code removed for brevity
services.AddSingleton<FunClass>();
}
Run Code Online (Sandbox Code Playgroud)
这是我的控制器类:
public class TestController : Controller
{
private FunClass _fun;
public TestController(FunClass fun)
{
_fun = fun;
}
public List<string> Index()
{
return _fun.GetUsers();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的FunClass:
public class FunClass
{
private MyDbContext db;
public FunClass(MyDbContext ctx) {
db = ctx;
}
public List<string> GetUsers()
{
var lst …
Run Code Online (Sandbox Code Playgroud) 在ASP.NET Core 2.1中注册自定义托管服务的正确方法是什么?例如,我已经定制托管源自服务BackgroundService命名MyHostedService
.我该如何注册?
public IServiceProvider ConfigureServices(IServiceCollection services)
{
//...
services.AddSingleton<IHostedService, MyHostedService>();
}
Run Code Online (Sandbox Code Playgroud)
要么
public IServiceProvider ConfigureServices(IServiceCollection services)
{
//...
services.AddHostedService<MyHostedService>();
}
Run Code Online (Sandbox Code Playgroud)
?
这些方法是否相同?
c# .net-core asp.net-core asp.net-core-2.1 asp.net-core-hosted-services
在我的服务器端 Blazor 应用程序中,以非常规方式处理身份验证。本质上,当用户访问页面时,他们会使用 Windows 凭据进行身份验证。此时,将创建自定义策略以在外部数据库 (Informix) 中查找该用户名,在该数据库中找到该应用程序中该用户的授权。特别是对于应用程序中的每个级别的授权(可以更新,转到此页面等),我正在创建一个新的声明,以根据存储在数据库中的权限添加到当前用户。
通常在视图中,我只是使用AuthenticationStateProvider
来获取此信息并且它没有问题。但是,当我需要访问处理更新/业务逻辑的服务类中的用户信息时,我似乎根本无法访问声明/用户。例如,一个用例是根据在初始身份验证期间添加的声明获取当前 Windows 帐户的数据库中存储的用户名,以记录他们的活动/跟踪。另一种方法是从数据库中获取当前登录用户的全名。
我已经在带有身份验证状态提供程序的服务类中尝试了 DI,HTTPContext
但它们都不起作用。我知道整体结构并不理想,但这是我必须处理的。任何有关如何解决此问题的见解将不胜感激!
我正在将ASP.NET Core 2.2与Pomelo.EntityFramework.MySql一起使用。
这是我的代码:
services.AddDbContext<dbContext>(options => options.UseMySQL(appConfigsSection["DbConnectionString"]));
services.AddSingleton<IUserService, UserService>();
services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(x=> {
x.Events = new JwtBearerEvents
{
OnTokenValidated = context =>
{
var userService = context.HttpContext.RequestServices.GetRequiredService<IUserService>();
}
};
Run Code Online (Sandbox Code Playgroud)
这是错误:
asp.net核心无法使用单例的作用域服务
在:
var userService = context.HttpContext.RequestServices.GetRequiredService<IUserService>();
Run Code Online (Sandbox Code Playgroud)
我的理解是DBContext应该用作Singleton服务,IUserService也应该用作。但是似乎DBContext被视为范围服务。
通过将IUserService切换回作用域服务,可以轻松修复它。但是我想知道为什么不能将DBContext用作单一服务吗?
我认为DBContext应该用作Singleton服务,对吗?