Entity framework ASP.NET Core 2.2如何使用依赖项注入向同一个类添加两个构造函数?

Entity framework ASP.NET Core 2.2如何使用依赖项注入向同一个类添加两个构造函数?,entity-framework,asp.net-core,Entity Framework,Asp.net Core,我有一个类“ConnectorManagement”,在这个类中,我需要使用Signal服务以及使用EF CORE查询db表 我无法解决如何使用构造函数和依赖注入将dbcontext和hubcontext加载到同一个类中。当前的结果是visual studio在调试中运行时无法加载项目。试图对此进行研究,但不了解需要做什么 当前代码如下: namespace myNamespace.Controller { public class ConnectorManagement : IHost

我有一个类“ConnectorManagement”,在这个类中,我需要使用Signal服务以及使用EF CORE查询db表

我无法解决如何使用构造函数和依赖注入将dbcontext和hubcontext加载到同一个类中。当前的结果是visual studio在调试中运行时无法加载项目。试图对此进行研究,但不了解需要做什么

当前代码如下:

 namespace myNamespace.Controller
 {
  public class ConnectorManagement : IHostedService
  {
    private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Logger));

    private readonly IHubContext<MessageHub> _hubContext;
    public readonly ApplicationDbContext _context;

    public ConnectorManagement(IHubContext<MessageHub> hubContext, ApplicationDbContext context)
    {
        _hubContext = hubContext;
        _context = context;
    }

    public Task StartAsync(CancellationToken cancellationToken)
    {
        log.Info("Initial Test");

        return Task.CompletedTask;
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        throw new NotImplementedException();
    }
namespace myNamespace.Controller
{
公共类连接器管理:IHostedService
{
私有静态只读log4net.ILog log=log4net.LogManager.GetLogger(typeof(Logger));
私有只读IHubContext\u hubContext;
公共只读应用程序bContext\u上下文;
公共连接器管理(IHubContext hubContext、ApplicationDbContext上下文)
{
_hubContext=hubContext;
_上下文=上下文;
}
公共任务StartSync(CancellationToken CancellationToken)
{
日志信息(“初始测试”);
返回Task.CompletedTask;
}
公共任务StopAsync(CancellationToken CancellationToken)
{
抛出新的NotImplementedException();
}
dbcontext类:

 namespace myNamespace.Data
 {
  public class ApplicationDbContext : IdentityDbContext
  {
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
    public DbSet<myProject.Models.ConnectorInbound> ConnectorInbound { get; set; }
    public DbSet<myProject.Models.ConnectorOutbound> ConnectorOutbound { get; set; }
    public DbSet<myProject.Models.SystemMapping> SystemMapping { get; set; }
 }
}
namespace myNamespace.Data
{
公共类ApplicationDbContext:IdentityDbContext
{
公共应用程序DBContext(DbContextOptions选项)
:基本(选项)
{
}
公共数据库集连接器绑定{get;set;}
公共DbSet ConnectorOutbound{get;set;}
公共数据库集系统映射{get;set;}
}
}
启动类:

namespace myProjectNamespace
{
public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("DefaultConnection")));
        services.AddDefaultIdentity<IdentityUser>()
            .AddDefaultUI(UIFramework.Bootstrap4)
            .AddEntityFrameworkStores<ApplicationDbContext>();

        // Start up the TcpServerTcpServer engine
        services.AddHostedService<ConnectorManagement>();

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        services.AddSignalR();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();

        app.UseAuthentication();

        app.UseSignalR(routes =>
        {
            routes.MapHub<MessageHub>("/messageHub");
        });

        loggerFactory.AddLog4Net();
        app.UseMvc();
    }
 }
}
名称空间myProjectNamespace
{
公营创业
{
公共启动(IConfiguration配置)
{
配置=配置;
}
公共IConfiguration配置{get;}
//此方法由运行时调用。请使用此方法将服务添加到容器中。
public void配置服务(IServiceCollection服务)
{
配置(选项=>
{
//此lambda确定给定请求是否需要非必要cookie的用户同意。
options.checkApprovered=context=>true;
options.MinimumSameSitePolicy=SameSiteMode.None;
});
services.AddDbContext(选项=>
options.UseSqlServer(
GetConnectionString(“DefaultConnection”);
services.AddDefaultIdentity()
.AddDefaultUI(UIFramework.Bootstrap4)
.AddEntityFrameworkStores();
//启动TCPServer TCPServer引擎
services.AddHostedService();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddSignalR();
}
//此方法由运行时调用。请使用此方法配置HTTP请求管道。
公共void配置(IApplicationBuilder应用程序、IHostingEnvironment环境、iLogger工厂)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
其他的
{
app.UseExceptionHandler(“/Error”);
//默认的HSTS值为30天。您可能希望在生产场景中更改此值,请参阅https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseAuthentication();
app.usesigner(路由=>
{
routes.MapHub(“/messageHub”);
});
loggerFactory.AddLog4Net();
app.UseMvc();
}
}
}

我没有注意到您正在将其注入托管服务的事实。托管服务是单例的,集线器上下文和数据库上下文都是作用域服务。您需要注入
IServiceProvider
,然后创建一个作用域。这需要针对每种使用情况进行;您不能将其持久化到例如,ivar。您只能在using语句中使用它

using (var scope = _serviceProvider.CreateScope())
{
    var context = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
    // Do something
}
使用(var scope=\u serviceProvider.CreateScope())
{
var context=scope.ServiceProvider.GetRequiredService();
//做点什么
}

我没有注意到您正在将其注入托管服务的事实。托管服务是单例的,集线器上下文和数据库上下文都是作用域服务。您需要注入
IServiceProvider
,然后创建一个作用域。这需要针对每种使用情况进行;您不能将其持久化到例如,ivar。您只能在using语句中使用它

using (var scope = _serviceProvider.CreateScope())
{
    var context = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
    // Do something
}
使用(var scope=\u serviceProvider.CreateScope())
{
var context=scope.ServiceProvider.GetRequiredService();
//做点什么
}

您遇到了什么错误?并定义“不正确”代码,根据您发布的信息,您的代码在我们看来是正确的。您好,我没有收到任何错误,项目尝试加载,然后再次自动停止。如果我从构造函数中删除对dbcontext的引用,则一切正常。我不知道我是在处理anit模式冲突还是其他问题。仅此而已我可以在调试控制台中找到:抛出异常:“System.Private.CoreLib.dll中的System.InvalidOperationException”线程0x6c84已退出,代码为0(0x0)。程序“[15904]iisexpress.exe”已退出,代码为0(0x0)。发布相关的startup.cs代码,可能有问题。是的,我已经添加了一个迁移,并且刚刚尝试更新数据库,但它说它已经是最新的。然后我删除了数据库并启动了它,但仍然失败。我在想,是否将dbcontext导入此类没有正确导入,可能没有拉参考底图输入所需的参数,即选项,其中包括有关连接字符串的详细信息,以及DI应自动处理的部分。您得到了什么错误?A