gpt4 book ai didi

c# - 在 AspNET Core 中使用 DI

转载 作者:太空宇宙 更新时间:2023-11-03 20:52:06 26 4
gpt4 key购买 nike

我有一个 DbContext 的派生类,称为 NavigationContext,它看起来像这样:

public class NavigationContext : DbContext
{
private readonly IConfiguration _configuration;

public NavigationContext(DbContextOptions<NavigationContext> options, IConfiguration configuration) : base(options)
{
_configuration = configuration;
}
//DbSets here ...

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer(_configuration.GetConnectionString("NavigationLoggingDatabase"));
}
}
}

Configuration注册到Startup.cs中的DI容器中,像这样:

    public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddDbContext<NavigationContext>(options => options.UseSqlServer(Configuration.GetConnectionString("NavigationLoggingDatabase")));
services.AddSingleton(_ => Configuration);
}

我的问题是我应该向 NavigationContext 构造函数发送什么?

    public int Add(TEntity item)
{
using (NavigationContext context = new NavigationContext(_contextOptionsBuilder.Options, ???))
{
context.Set<TEntity>().Add(item);
context.SaveChanges();
return item.Id;
}
}

最佳答案

这不是您进行 DI(依赖注入(inject))的方式。每当您看到服务的 new 关键字时,您必须知道它是错误的。

首先,您不必向 DbContext 传递任何内容,OnConfiguring 覆盖不应该存在,因为您没有使用它。此调用负责该配置:

services.AddDbContext<NavigationContext>(options => options.UseSqlServer(Configuration.GetConnectionString("NavigationLoggingDatabase")));

其次,您不使用 using 注入(inject)依赖项,因此:

public int Add(TEntity item)
{
_context.Set<TEntity>().Add(item);
_context.SaveChanges();
return item.Id;
}

并且,为了让它起作用:

public class SomeController : Controller
{
private readonly NavigationContext _context;

public SomeController(NagivationContext context)
{
_context = context;
}
}

最后的建议是,您真的应该尽可能多地使用 Entity Framework Core 方法的异步版本:

public async Task<int> Add(TEntity item)
{
_context.Set<TEntity>().Add(item);
await _context.SaveChangesAsync();
return item.Id;
}

关于c# - 在 AspNET Core 中使用 DI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54226294/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com