【发布时间】:2020-10-16 15:49:30
【问题描述】:
首先,让我先说我绝不是一名专业的编码员,而且由于我已经在不同的领域工作了很多年,所以我现在才重新开始为我的业余项目编码有。我每个 ado.net 的旧项目(带有存储过程的 ms sql)、web 表单、很少的 mvc/etc。
过去,我会创建这样的类:
public class blah
{
public int Id;
//more properties
public static Get(id){ //call db class here, get row, use linq to convert to object }
}
现在,使用 .net 核心,这被认为是“糟糕的”。我正在学习 EF,虽然我可以使用 DI..我只是觉得拥有 DI 链很麻烦。即:我不能只使用默认构造函数创建类的实例。我现在必须传入 DI。为此,我需要将 DI 链接到控制器,并且 w/e 子类可能需要使用指定的类。默认情况下,在我的 startup.cs 中,我有所需的代码:
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
现在,在我的课程中,我不能只调用 ApplicationDbContext()...因为它必须使用 DI 来获取连接字符串。所以我把它链接起来,所以这个类现在看起来像这样:
public class blah
{
public int Id;
//more properties
private ApplicationDbContext _context;
public blah(ApplicationDbContext dbContext)
{
_context = dbContext;
}
public static Get(id){ //use EF here to get the object }
}
这会导致另一个问题,即现在我无法执行“blah myBlah = blah();”如果我只想创建一个类的实例。 W/e 我调用它,再次必须有 DI。
我错过了什么吗?我读过 ServiceLocators/etc 是不好的(反模式),应该避免。
请注意,我不仅使用“控制器”,而且还试图找出 Razor 页面/whatnot 适合的位置。
【问题讨论】:
-
你的问题到底是什么?
-
不,你并没有真正错过任何东西 - 一开始可能会觉得尴尬和过度,但一旦你掌握了窍门,就会有很多好处 - 你的项目越大,你获得的好处就越多。如果它只是一个业余项目,你可能永远也达不到这一点,但这里强制执行的概念通常也会导致代码更简洁。当您使用自动测试时,依赖注入真正发挥作用。
-
我没心情写一个大的答案,所以我只留下一个小提示:您不一定需要将服务从构造函数传递给您的方法(尤其是如果只在单一方法中使用),你也可以做
public void Get(int id, [FromServices] ApplicationDbContext dbContext)。 -
谢谢 Compufreak,我想我会习惯的:D
-
如果你想精通 Asp.Net Core,你真的需要阅读和研究依赖注入,使用 [FromServices],虽然有时可能很有用,但认为只使用更干净构造函数注入。您需要区分作为服务的类和作为模型的类。
标签: c# asp.net-core dependency-injection