gpt4 book ai didi

generics - ASP.NET Core 中的通用存储库在 Startup.cs 中的每个表中没有单独的 AddScoped 行?

转载 作者:行者123 更新时间:2023-12-03 05:59:28 25 4
gpt4 key购买 nike

我的项目中有一个通用存储库。考虑以下 Controller 片段

public class Lookup1Controller : Controller
{
readonly MyDbContext _db;

public Lookup1Controller(MyDbContext dataContext)
{
_db = dataContext;
}

public async Task<IActionResult> Index()
{

IGenericRepository<Lookup1> _repository = new GenericRepository<Lookup1>(_db);
var lookup1s = await _repository.SelectAll();

return View(lookup1s);
}

我认为没有必要在我的通用存储库以及每个 Controller 中都包含我的数据库引用。

我将其重构为:

public class Lookup1Controller : Controller
{
private IGenericRepository<Lookup1> _repository;

public Lookup1Controller(IGenericRepository<Lookup1> repository)
{
_repository = repository;
}

public async Task<IActionResult> Index()
{
var lookup1s = await _repository.SelectAll();

return View(lookup1s);
}

}

从我读到的内容来看,这是更简洁的 ASP.NET 5 最佳实践。但如果我在浏览器中访问该 Controller 路由,我会收到以下错误:

InvalidOperationException: Unable to resolve service for type 'MyProject.Data.IGenericRepository`1[MyProject.Models.Lookup1]' while attempting to activate 'MyProject.Controllers.Lookup1.

因为我还没有注入(inject)GenericRepository来使用该接口(interface)。

我在 Startup.cs 中为 ConfigureServices 方法中的每个表添加了一个 AddScoped

services.AddScoped<IGenericRepository<Lookup1>,GenericRepository<Lookup1>> ();
services.AddScoped<IGenericRepository<Lookup2>,GenericRepository<Lookup2>> ();
services.AddScoped<IGenericRepository<Lookup3>,GenericRepository<Lookup3>> ();
services.AddScoped<IGenericRepository<Lookup4>,GenericRepository<Lookup4>> ();
etc

这样我的代码运行时不会抛出异常。

但是我的数据库有大约 100 个简单的查找表。当我查看上面的 100 行代码时,它看起来不太正确。

感觉就像复制并粘贴代码。每次我通过添加新模型和带有 View 的 Controller 来添加新表时,我的代码都会编译而不会出现错误。但是,如果我运行该程序并转到该 View ,如果我忘记将 AddScoped 行添加到我的 Startup.cs 中,我可能会收到 Controller 运行错误。对于可维护性来说不太好。

我的问题:

  1. Startup.csConfigureServices 方法中的每个查找表提供 services.AddScoped 真的是最佳实践吗?

  2. 它是一个通用存储库,所以有没有办法将这 100 行复制和粘贴行写在一行中?

  3. 如果不是,那么使用我的代码执行此操作的最佳实践方法是什么?

最佳答案

只需使用非通用注册重载(需要传递 2 个 Type 对象的重载。)然后提供 open generic types您的接口(interface)和实现:

services.AddScoped(typeof(IGenericRepository<>), typeof(GenericRepository<>));

在您的 Controller 中,添加特定类型(封闭通用类型)存储库的依赖项:

public HomeController(IGenericRepository<Lookup1> repository)
{
...
}

关于generics - ASP.NET Core 中的通用存储库在 Startup.cs 中的每个表中没有单独的 AddScoped 行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33566075/

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