gpt4 book ai didi

asp.net-mvc - 使用带有 MVC 5/EF 的 GenericRepository 实现工作单元

转载 作者:行者123 更新时间:2023-12-01 11:46:58 25 4
gpt4 key购买 nike

更新 3:

我看到了这个视频,以及作者如何强调使用 Repository/UOW...来反对我不鼓励的做法。顺便说一句,作者正在使用 ORM(EF)

http://pluralsight.com/training/Courses/TableOfContents/spa

更新 2:

当我在玩 Repository 时,我有这个 scanrio 要处理,我不确定我是否遵循正确的方向......所以在我的 Controller 中:

public class PersonsController : Controller
{
GenericRepository<Person> _genericRepository = new GenericRepository<Person>(new PersonsContext());

public ActionResult Index()
{
GenericRepository<Actors> _genericActorRepository = new GenericRepository<Actors>(new PersonsContext());
IEnumerable<Actors> _actorList = _genericActorRepository.GetAll();
//IList<Actors> _actorList1 = _genericActorRepository.GetAll().ToList();
ViewBag.ActorList = new SelectList(_actorList);
return View(_genericRepository.GetAll());
}

更新:

这是 link的 Microsoft Developer Network 谈论 GenericRepository!

我正在尝试在系统的设计阶段实现最佳实践。我将使用 Entity Framework 、ASP.NET MVC 5 C# 和通用存储库/工作单元模式(希望如此)。

我的问题:如何在我的 GenericRepository 中引入工作单元?

这是我的 GenericRepository 类:

public interface IGenericRepository<TEntity> : IDisposable
{
Task<TEntity> GetByIdAsync(int id);
IQueryable<TEntity> SearchFor(Expression<Func<TEntity, bool>> predicate);
IQueryable<TEntity> GetAll();
Task EditAsync(TEntity entity);
Task InsertAsync(TEntity entity);
Task DeleteAsync(TEntity entity);
}

public class GenericRepository<TEntity> : IGenericRepository<TEntity> where TEntity : class
{
protected DbSet<TEntity> _dbSet;
private readonly DbContext _dbContext;

public GenericRepository(DbContext dbContext)
{
_dbContext = dbContext;
_dbSet = _dbContext.Set<TEntity>();
}

public GenericRepository() {}

public IQueryable<TEntity> GetAll()
{
return _dbSet;
}

public async Task<TEntity> GetByIdAsync(int id)
{
return await _dbSet.FindAsync(id);
}

public IQueryable<TEntity> SearchFor(Expression<Func<TEntity, bool>> predicate)
{
return _dbSet.Where(predicate);
}

public async Task EditAsync(TEntity entity)
{
_dbContext.Entry(entity).State = EntityState.Modified;
await _dbContext.SaveChangesAsync();
}

public async Task InsertAsync(TEntity entity)
{

_dbSet.Add(entity);
await _dbContext.SaveChangesAsync();
}

public async Task DeleteAsync(TEntity entity)
{
//if (context.Entry(entityToDelete).State == EntityState.Detached)
//{
// dbSet.Attach(entityToDelete);
//}
_dbSet.Remove(entity);
await _dbContext.SaveChangesAsync();
}

public void Dispose(bool disposing)
{
if (_dbContext != null)
{
_dbContext.Dispose();
}
GC.SuppressFinalize(this);
}

public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}

模型类:

public class Person
{
public int Id { get; set; }
public String Fullname { get; set; }
public String Profession { get; set; }
public int Age { get; set; }
}

上下文:

public class PersonsContext : DbContext
{
public PersonsContext() : base("name=PersonsContext")
{
}
public DbSet<Person> People { get; set; }
}

Controller :

public class PersonsController : Controller
{
GenericRepository<Person> _genericRepository = new GenericRepository<Person>(new PersonsContext());
//
// GET: /Persons/
public ActionResult Index()
{
return View(_genericRepository.GetAll());
}

//
// GET: /Persons/Details/5
public async Task<ActionResult> Details(Int32 id)
{
Person person = await _genericRepository.GetByIdAsync(id);
if (person == null)
{
return HttpNotFound();
}
return View(person);
}

//
// GET: /Persons/Create
public ActionResult Create()
{
return View();
}

//
// POST: /Persons/Create
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Create(Person person)
{
if (ModelState.IsValid)
{
await _genericRepository.InsertAsync(person);
return RedirectToAction("Index");
}

return View(person);
}

//
// GET: /Persons/Edit/5
public async Task<ActionResult> Edit(Int32 id)
{
Person person = await _genericRepository.GetByIdAsync(id);
if (person == null)
{
return HttpNotFound();
}
return View(person);
}

//
// POST: /Persons/Edit/5
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Edit(Person person)
{
if (ModelState.IsValid)
{
await _genericRepository.EditAsync(person);
return RedirectToAction("Index");
}
return View(person);
}
}

最佳答案

在我看来,这在很大程度上已成为一种反模式。使用工作单元和存储库是重要且好的设计,但是大多数人忽视了 Entity Framework 已经是工作单元和通用存储库的实现这一事实。

仅当您确实认为有必要(例如,您打算支持不同类型的数据访问)或者您认为您的应用程序将特别长寿并且需要大量持续维护。如果您的应用相对简单,和/或不太可能发生太大变化,则没有理由实现额外的抽象。

我不建议直接在 Controller 中使用 EF 代码,因此您应该使用某种数据抽象,例如服务层或具体存储库(与通用存储库相反,具体存储库具有 GetCustomers 等方法() 将业务逻辑抽象成一个方法)。

实现自己的 UoW 或通用存储库的另一个原因是,如果您不打算使用支持 UoW 的 ORM,那么您将需要自己的实现。

关于asp.net-mvc - 使用带有 MVC 5/EF 的 GenericRepository 实现工作单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21886397/

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