我正在使用ASP 5,MVC 6和Entity Framework 7来创建一个小型网站(可预见地少于100个注册用户和10,000个月访问者)。我是一名新手程序员,拥有不到1000小时的综合经验和研究。
我在底部有很多问题,但总的来说,我只是想确定我了解存储库模式以及为什么它对我有益。现在我只使用它,因为我从多个来源读取“这是个好主意”,因为它似乎对组织目的有意义。
在我阅读了存储库模式之后。我从这些来源中得到了一些想法:
Microsoft,Code Guru,DotNetCurry
我创建了一个通用接口IRepository:
interface IRepository<TEntity,in TPKey> where TEntity : class
{
IEnumerable<TEntity> GetAll();
TEntity Get(TPKey id);
void Insert(TEntity ent);
void Update(TEntity ent);
void Delete(TEntity ent);
}
然后我为我的一个实体创建了一个特定的存储库:
public class CollegeRepository : IRepository<Models.College, int>
{
private ApplicationDbContext _context = null;
public CollegeRepository()
{
_context = new ApplicationDbContext();
}
public CollegeRepository(ApplicationDbContext context)
{
this._context = context;
}
public College Get(int id)
{
return _context.Colleges.Where(c => c.CollegeID == id).FirstOrDefault();
}
public IEnumerable<College> GetAll()
{
return _context.Colleges.ToList();
}
public void Insert(College college)
{
_context.Colleges.Add(college);
}
public void Update(College college)
{
_context.Update(college);
}
public void Delete(College college)
{
_context.Colleges.Remove(college);
}
在我的CollegesController中,我最初做过这样的事情:
// POST: Schools/Edit/5
[HttpPost]
[Authorize]
[ValidateAntiForgeryToken]
public IActionResult Edit(College school, IFormFile logo)
{
if (ModelState.IsValid)
{
if (logo != null)
{
byte[] imgBytes = new byte[logo.Length];
logo.OpenReadStream().Read(imgBytes, 0, (int)logo.Length);
school.Logo = imgBytes;
_context.Update(school);
}
else
{
// Mark the logo as unmodified so the data is not lost.
_context.Update(school).Property(s => s.Logo).IsModified = false;
}
_context.SaveChanges();
return RedirectToAction("Index");
}
return View(school);
}
然后改为:
// POST: Schools/Edit/5
[HttpPost]
[Authorize]
[ValidateAntiForgeryToken]
public IActionResult Edit(College school, IFormFile logo)
{
if (ModelState.IsValid)
{
collegeRepo.Update(school, logo);
_context.SaveChanges();
return RedirectToAction("Index");
}
return View(school);
}
并修改了特定的存储库以添加Update重载:
public class CollegeRepository : IRepository<Models.College, int>
{
public void Update(College college)
{
_context.Update(college);
}
public void Update(College college, IFormFile logo)
{
if (logo != null)
{
byte[] imgBytes = new byte[logo.Length];
logo.OpenReadStream().Read(imgBytes, 0, (int)logo.Length);
college.Logo = imgBytes;
_context.Update(college);
}
else
{
// Mark the logo as unmodified so the data is not lost.
_context.Update(college).Property(s => s.Logo).IsModified = false;
}
}
}
似乎我已经成功地将我的逻辑与我的控制器分开了。这是存储库模式背后的想法吗?我在这个例子中成功使用过它吗?我失败到什么程度? 在我完成所有这些之后,我正在阅读存储库模式对于仅使用(并且可能只使用)1个数据源(如我的)的项目而言并不是那么有用,但应该始终存在某种单元工作类将逻辑排除在控制器之外(我模糊地理解拥有一个工作单元意味着什么,但是也可以理解触及这个问题的答案)。 我还读到了存储库模式有助于减少重复代码。在我没有经验的眼睛里,我看不到远远的想法,认为我可能会再次使用我的任何控制器代码。在没有存储库模式的情况下,您看到(可以看到)代码重复的常见MVC场景是什么?