gpt4 book ai didi

c# - 没有存储库模式的 ASP.Net MVC 和 Entity Framework 项目架构

转载 作者:太空狗 更新时间:2023-10-30 00:32:13 24 4
gpt4 key购买 nike

我正在使用 ASP.NET MVC 和 Entity Framework 开始一个新的小项目。 (SQL Server - 大约 20 个数据库表)在过去的项目中,我使用过 Linq2SQL,但它似乎已经过时了。

我已经阅读了很多关于为 EF 使用存储库模式(优缺点)的帖子,对我来说,在没有存储库模式的情况下编写代码似乎更好/更简单。

我创建了以下项目架构:

namespace MySite.Models
{
public class User
{
public Int32 ID { get; set; }
public String Email { get; set; }
public String Password { get; set; }
public String Name { get; set; }
public Int32 Gender { get; set; }
}
}

namespace MySite.DAL
{
public class Users
{
public static IEnumerable<User> GetUsers()
{
using (var context = new DatingSiteContext())
{
return context.Users.ToList();
}
}

public static User GetUserByID(int id)
{
using (var context = new DatingSiteContext())
{
return context.Users.Find(id);
}
}
}

namespace MySite.Controllers
{
public class HomeController : Controller
{

public ActionResult Index()
{
ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";

var users = DAL.Users.GetUsers();

return View(users);
}
}
}
  • 像这样使用 EF 有什么缺点? (除了缺少单位测试支持)
  • 在每次调用 DAL 时创建一个新的 DbContext 是否错误?任何性能命中?
  • 还有其他推荐的使用 EF 的结构吗?例子? :)
  • 您会在新项目中使用 Linq2SQL 吗?

谢谢。

编辑:

GetUsers() 和 GetUserByID() 中的代码仅作为示例,我理解从数据库返回所有记录(缺少分页或过滤器)是一种不好的做法

最佳答案

您实际上只是创建了一个存储库,只是您将其称为“数据访问层”,在我看来,这不是一个好名字,因为 Entity Framework 是数据访问层。存储库是数据访问层(在本例中为 Entity Framework )之上的抽象。


Is it wrong to create a new DbContext on each call to DAL ? Any Performance hit?

不,这很好,但是当您在 DbContext 的一个实例中获取实体时可能会造成麻烦,并尝试在另一个实例中更新它。


Would you use Linq2SQL in a new project ?

不,Microsoft 提出 Entity Framework 作为 L2SQL 的继任者并且它的积极开发已经停止。


Any other recommended structure for using EF ? Examples? :)

您使用的方法,特定的存储库,将导致大量冗余代码。您可以创建一个实现接口(interface)的通用存储库:

public interface IRepository<TEntity> 
where TEntity : class, new()
{
IEnumerable<TEntity> GetAll();

TEntity GetById(int id);

IQueryable<TEntity> Table { get; }
}

以及这个的实现:

public EfRepository<TEntity> : IRepository<TEntity>
where TEntity : class, new()
{
private readonly DatingSiteContext _context;

public EfRepository()
{
_context = new DatingSiteContext();
}

private IDbSet<TEntity> Entities
{
get
{
return _context.Set<TEntity>();
}
}

public IEnumerable<TEntity> GetAll()
{
return Entities.ToList();
}

public TEntity GetById(int id)
{
return Entities.Find(id);
}

public IQueryable<TEntity> Table
{
get { return Entities; }
}
}

您可以像这样在您的 Controller 中使用此存储库:

public class HomeController : Controller
{
private readonly IRepository<User> _userRepository;

public HomeController()
{
_userRepository = new EfRepository<User>();
}

public ActionResult Index()
{
var users = _userRepository.GetAll();
var inactiveUsers = _userRepository.Table.Where(u => !u.Active).ToList();
}
}

这个通用存储库允许您创建模拟存储库:

public class FakeUserRepository : IRepository<User> 
{
// ...
}


这种方法可能看起来像很多代码,但随着实体类型数量的增加,它将为您节省大量工作,因为您所要做的就是创建一个 IRepository<>。 Controller 中的字段。然而,您可以使用 IQueryable<> 获得很大的灵 active 。允许延迟执行的属性。

我并不是说这是最好的方法,只是我在项目中经常使用的一种方法。我不得不说,我通常在 Controller 和存储库之间写一个业务(服务)层。我在那里保留我的业务逻辑和复杂的 Linq 查询(及其执行)。我还使用 IoC 容器来处理我的对象的生命周期(例如 DbContext 的实例和服务)。参见 this question了解更多相关信息。

关于c# - 没有存储库模式的 ASP.Net MVC 和 Entity Framework 项目架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19427457/

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