gpt4 book ai didi

c# - 用于数据库访问的静态类的 ASP.NET MVC 指南

转载 作者:太空狗 更新时间:2023-10-29 18:26:38 26 4
gpt4 key购买 nike

我目前在我的 ASP.NET 应用程序(使用 Entity Framework )中使用 MVC 模式的方式如下:

1) 我的 Models 文件夹包含所有 EF 实体,以及我的 ViewModels

2) 我有一个 Helpers 文件夹,我在其中存储为特定应用程序创建的类。

3) 在我的 Helpers 文件夹中,我有一个名为 MyHelper 的静态类,它包含使用 EF 访问数据库的方法。

namespace myApp.Helpers
{
public static class MyHelper
{
public static async Task<ProductVM> GetProductAsync(int productId)
{
using (var context = new myEntities())
{
return await context.vwxProducts.Where(x => x.ProductId == productId).Select(x => new ProductVM { A = x.A, B = x.B }).FirstOrDefaultAsync();
}
}
}
}

4) 然后我的 Controller 在必要时调用这些函数:

namespace myApp.Controllers
{
public class ProductController : Controller
{

[HttpGet]
public async Task<ActionResult> Index(int productId)
{
var productVM = await MyHelper.GetProductAsync(productId);
return View(productVM);
}
}
}

我经常在 SO 中遇到“不要使用静态类,静态类是邪恶的,等等”类型的注释。这适用于这种情况吗?如果是,为什么?我的应用是否应该遵循更好的“结构”以获得最佳实践并避免此类陷阱?

最佳答案

你真的不能为此使用静态类。您的 Entity Framework 上下文对于每个请求应该只有一个实例。您在此处的方法为每个方法实例化了一个新的上下文,这将导致 Entity Framework 出现大量问题。

一般概念没问题,但您的 MyHelper 类应该是一个普通类。添加一个采用上下文实例的构造函数,然后使用 DI 容器将上下文注入(inject)助手类,并将助手类注入(inject) Controller 。

更新

助手

namespace myApp.Helpers
{
public class MyHelper
{
private readonly DbContext context;

public MyHelper(DbContext context)
{
this.context = context;
}

public async Task<ProductVM> GetProductAsync(int productId)
{
return await context.vwxProducts.Where(x => x.ProductId == productId).Select(x => new ProductVM { A = x.A, B = x.B }).FirstOrDefaultAsync();
}
}
}

Controller

namespace myApp.Controllers
{
public class ProductController : Controller
{
private readonly MyHelper myHelper;

public ProductController(MyHelper myHelper)
{
this.myHelper = myHelper;
}

[HttpGet]
public async Task<ActionResult> Index(int productId)
{
var productVM = await myHelper.GetProductAsync(productId);
return View(productVM);
}
}
}

然后,您只需要设置一个 DI 容器来注入(inject)所有内容。该代码完全取决于您最终使用的容器,因此我无法为您提供进一步的帮助。不过,它通常非常简单。只需阅读容器的文档。您需要将对象的生命周期范围设置为请求。同样,不同的容器是不同的,但它们都有某种请求范围。

关于c# - 用于数据库访问的静态类的 ASP.NET MVC 指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35367127/

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