这是使用存储库模式的正确方法吗?

时间:2016-03-27 04:37:55

标签: c# asp.net asp.net-mvc entity-framework repository-pattern

我正在使用ASP 5,MVC 6和Entity Framework 7来创建一个小型网站(可预见地少于100个注册用户和10,000个月访问者)。我是一名新手程序员,拥有不到1000小时的综合经验和研究。

我在底部有很多问题,但总的来说,我只是想确定我了解存储库模式以及为什么它对我有益。现在我只使用它,因为我从多个来源读取“这是个好主意”,因为它似乎对组织目的有意义。

在我阅读了存储库模式之后。我从这些来源中得到了一些想法:

MicrosoftCode GuruDotNetCurry

我创建了一个通用接口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场景是什么?

0 个答案:

没有答案