相关疑难解决方法(0)

在ASP .Net Singleton注入类中使用DbContext

我需要在我的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)

c# dependency-injection asp.net-core

28
推荐指数
5
解决办法
2万
查看次数

在ASP.NET Core中注册HostedService的正确方法.AddHostedService vs AddSingleton

在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

20
推荐指数
3
解决办法
1万
查看次数

在 Blazor 中的视图之外访问经过身份验证的用户

在我的服务器端 Blazor 应用程序中,以非常规方式处理身份验证。本质上,当用户访问页面时,他们会使用 Windows 凭据进行身份验证。此时,将创建自定义策略以在外部数据库 (Informix) 中查找该用户名,在该数据库中找到该应用程序中该用户的授权。特别是对于应用程序中的每个级别的授权(可以更新,转到此页面等),我正在创建一个新的声明,以根据存储在数据库中的权限添加到当前用户。

通常在视图中,我只是使用AuthenticationStateProvider来获取此信息并且它没有问题。但是,当我需要访问处理更新/业务逻辑的服务类中的用户信息时,我似乎根本无法访问声明/用户。例如,一个用例是根据在初始身份验证期间添加的声明获取当前 Windows 帐户的数据库中存储的用户名,以记录他们的活动/跟踪。另一种方法是从数据库中获取当前登录用户的全名。

我已经在带有身份验证状态提供程序的服务类中尝试了 DI,HTTPContext但它们都不起作用。我知道整体结构并不理想,但这是我必须处理的。任何有关如何解决此问题的见解将不胜感激!

c# authentication .net-core blazor

3
推荐指数
1
解决办法
2814
查看次数

为什么services.AddDbContext &lt;dbContext&gt;()使dbContext成为作用域服务?应该不是Singleton服务?

我正在将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服务,对吗?

这里

c# entity-framework entity-framework-core asp.net-core

0
推荐指数
1
解决办法
171
查看次数