存储库模式和MVC有帮助

本文关键字:MVC 有帮助 模式 存储 | 更新日期: 2023-09-27 18:09:42

我是c#和ASP的新手。. NET MVC和我试图理解存储库模式。我读了很多文章,但我就是不明白如何使用它。我目前使用LINQ SQL访问我的SQL Server 2005数据库和测试目的,我创建了两个表。我有一个Employees表和一个EmployeeContacts表。两个表的pk都是UserName。

员工

  • 用户名
  • LastName
  • FirstName
  • 地位
  • HireDate

EmployeeContacts

  • 用户名
  • Contact1
  • Contact1Phone
  • Contact1Relationship

两个表之间是一对一的关系。可以添加、更新、删除员工,也可以删除EmployeeContacts表中的数据。

那么,我是应该创建一个供两个实体使用的基础存储库,还是应该为每个实体分别创建一个存储库?如果有人愿意给我看一些代码,那就太好了。

到目前为止,我有这个Employee存储库。我也有一个EmployeeContacts
namespace MvcDirectoryLINQ.Models
{
public class EmployeeRepository
{
    private TestDB_DataDataContext db = new TestDB_DataDataContext();
    private UserName u = new UserName(); 
    //
    // Query Methods
    public IQueryable<Employee> FindAllEmployees()
    {
        return db.Employees;
    }
    public IQueryable<Employee> FindRecentEmployees()
    {
        DateTime myDate = DateTime.Today.AddMonths(-6); 
        return from empl in db.Employees
               where empl.HireDate >= myDate
               orderby empl.HireDate 
               select empl;
    }
    public Employee GetEmployee(string UserName)
    {
        return db.Employees.SingleOrDefault(d => d.UserName == UserName);
    }
    //
    // Insert/Delete Methods
    public void Add(Employee employee)
    {
       // get the UserName which is created from the email
        employee.UserName = u.ReturnUserName(employee.Email); 
        //Insert the new employee into the database
        db.Employees.InsertOnSubmit(employee);
        db.EmployeeContacts.InsertOnSubmit(employee.EmployeeContact); 
    }
    public void Delete(Employee employee)
    {
        db.EmployeeContacts.DeleteOnSubmit(employee.EmployeeContact);
        db.Employees.DeleteOnSubmit(employee);
    }
    //
    // Persistence
    public void Save()
    {
        db.SubmitChanges();
    }
}

}

我有一个EmployeeFormViewModel类:

namespace MvcDirectoryLINQ.Models
{
public class EmployeeFormViewModel
{
    //Properties
    public Employee Employee { get; private set; }
    public EmployeeContact EmployeeContact { get; private set; }

    //Constructor
    public EmployeeFormViewModel(Employee employee, EmployeeContact employeeContact)
    {
        Employee = employee;
        EmployeeContact = employeeContact;

    }
}
}

EmployeeController代码:

    [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Edit(string UserName, FormCollection formValues)
    {
        Employee employee = employeeRepository.GetEmployee(UserName);
        EmployeeContact employeecontact = employeecontactRepository.GetContact(UserName); 
        try
        {

            UpdateModel(employee);
            UpdateModel(employeecontact);

            employeecontactRepository.Save(); 
            employeeRepository.Save();

            return RedirectToAction("Details", new { UserName = employee.UserName });
        }
        catch
        {
            foreach (var issue in employee.GetRuleViolations())
            {
                ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
            }

            return View(new EmployeeFormViewModel(employee, attendingID)); 
        }
    }

在我看来,我继承自@model MvcDirectoryLINQ.Models.EmployeeFormViewModel。我的Employee数据保存正确,但employeeconcontacts不能保存,我不知道为什么。

我是否正确地实现了存储库模式?

存储库模式和MVC有帮助

使用存储库模式(据我所知)的主要目标是将应用程序与使用特定的数据访问层解耦。您在这里没有这样做,因为您创建了我可以看到您的EmployeeRepository类没有实现接口。你想要的是EmployeeRepository : IEmployeeRepository

然后,在控制器代码中,您可以传递IEmployeeRepository而不是具体使用EmployeeRepository。这将给您带来两个好处:

  • 如果你需要切换后端代码,你只需要创建另一个类来实现接口。
  • 当你去测试你的控制器时,你可以传递一个所谓的模拟对象来实现接口,而不是击中实际的数据库,这会减慢你的测试速度,也会破坏单元测试。
我注意到的另一件事是,您在存储库中启动DataContext 。如果您想对多个不同类型的对象进行更改,那么您将因此打开多个DataContext,我认为这不是您想要的,因为您的更改将不是事务性的。您可能需要查看Unit of Work模式以获得解决方案。

当学习一个模式时,在尝试实现它之前,首先要弄清楚它的主要好处。在某些情况下,这可能没有意义。如果你需要我详细说明什么,请告诉我。好运。

那么我应该创建一个供两个实体使用的基础存储库还是应该为每个实体分别创建一个存储库?

使用存储库模式时的一般规则是每个实体类型应该有一个存储库类。EmployeeContacts可以独立于任何Employee吗?如果是这样,它们应该有自己的存储库。他们总是和员工有关系吗?如果是这样,可以使用Employee存储库本身来管理它们。