【发布时间】:2016-05-23 04:41:19
【问题描述】:
我即将开始一个中小型项目。我绝不是软件架构师。但我有时会质疑我所做的每一个动作。因为我想做正确的事情。
我找到了一种实现简单存储库的方法,我想知道这是否是一种“正确”的方法。我来到了这个解决方案,因为我知道发生了什么,并且在我掌握知识之前没有考虑复杂的事情:)
来了。
工作单元
我确保将所有存储库保存在相同的 dbcontext 下。在我的 uof 中,当从控制器调用它时,我可以访问所有 repo。
public class UnitOfWork : IDisposable
{
private ContactRepository _contactRepo;
private ApplicationDbContext _entities;
public UnitOfWork(ApplicationDbContext entities)
{
_entities = entities;
}
public ContactRepository ContactRepo
{
get
{
if (_contactRepo == null)
{
_contactRepo = new ContactRepository(_entities);
}
return _contactRepo;
}
}
public void Save()
{
_entities.SaveChanges();
}
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
_entities.Dispose();
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
ContactRepository
这是一个存储库的简短示例,它接收 dbcontext 并使用它来获取我想要的任何数据
public class ContactRepository
{
private ApplicationDbContext _entities;
public ContactRepository(ApplicationDbContext entities)
{
_entities = entities;
}
public IEnumerable<Contact> GetAll()
{
return _entities.Contacts;
}
}
控制器
控制器的简短示例
public class ContactController : Controller
{
UnitOfWork uow = new UnitOfWork(new ApplicationDbContext());
public ActionResult Index()
{
var contacts = uow.ContactRepo.GetAll();
return View(contacts);
}
protected override void Dispose(bool disposing)
{
uow.Dispose();
base.Dispose(disposing);
}
}
通过这种方式,我将可以访问我所针对的同一 dbcontext 下的所有存储库。
我知道事情可以做得更聪明/不同。例如,一个可扩展的通用 repo。但在这种情况下,我的目标是简单易懂的东西。但还是不想犯大错,如果有重大缺陷的话。
您是否发现这种通过实体框架处理数据的方式存在重大缺陷?
【问题讨论】:
-
架构对我来说似乎很好,我都不是建筑师。我建议你把代码放在codereview.stackexchange.com
标签: asp.net asp.net-mvc entity-framework repository