Шаблон репозитория и справка MVC - PullRequest
4 голосов
/ 27 сентября 2011

Я новичок в C # и ASP.NET MVC, и я пытаюсь понять шаблон хранилища.Я прочитал много статей, но я просто не понимаю, как его использовать.В настоящее время я использую LINQ to SQL для доступа к своей базе данных SQL Server 2005, и для целей тестирования я создал две таблицы.У меня есть таблица Employees и таблица EmployeeContacts.ПК обеих таблиц - UserName.

Сотрудники

  • Имя пользователя
  • Фамилия
  • Имя
  • Должность
  • Эл. Почта
  • Статус

  • HireDate

EmployeeContacts

  • UserName
  • Contact1
  • Contact1Phone
  • Contact1Relationhip

Между двумя таблицами существует отношение один к одному.Сотрудник может быть добавлен, обновлен и удален, а также данные в таблице EmployeeContacts.

Так я бы создал базовый репозиторий для использования обеими сущностями или я должен создать репозиторий для каждой сущности отдельно?Если кто-нибудь захочет показать мне какой-нибудь код, это было бы здорово.

Пока у меня есть этот репозиторий Сотрудника.У меня также есть один для 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.Мои данные о сотрудниках сохраняются правильно, а контакты о сотрудниках - нет, и я понятия не имею, почему.

Правильно ли я реализую шаблон репозитория?

Ответы [ 2 ]

4 голосов
/ 27 сентября 2011

Основная цель при использовании шаблона репозитория (насколько я понимаю) состоит в том, чтобы отделить ваше приложение от использования определенного уровня доступа к данным. Вы не сделали этого здесь, потому что вы создаете. Я вижу, что ваш класс EmployeeRepository не реализует интерфейс. Вы действительно хотите иметь что-то вроде EmployeeRepository : IEmployeeRepository

Затем в вашем коде контроллера вы можете передать IEmployeeRepository вместо конкретной работы с EmployeeRepository. Это даст вам два преимущества:

  • Если вам когда-нибудь понадобится переключить бэкэнд-код, вам нужно только создать другой класс, реализующий интерфейс.
  • Когда вы собираетесь тестировать свои контроллеры, вы можете обойти так называемый фиктивный объект, который реализует интерфейс, вместо того, чтобы поразить реальную базу данных, что замедляет ваши тесты и также нарушает юнит-тестирование.

Еще одна вещь, которую я заметил, это то, что вы раскручиваете DataContext внутри вашего хранилища. Если бы вы хотели внести изменения в несколько различных типов объектов, у вас было бы открыто несколько DataContext, что, я думаю, не то, что вам нужно, поскольку ваши изменения не будут транзакционными. Возможно, вы захотите найти шаблон Unit of Work для решения.

При изучении шаблона, попробуйте сначала выяснить главное преимущество, прежде чем пытаться его реализовать. В некоторых случаях это может не иметь смысла. Пожалуйста, дайте мне знать, если вы хотите, чтобы я подробно остановился Удачи.

4 голосов
/ 27 сентября 2011

Так я бы создал базовый репозиторий для использования обеими сущностями или я должен создать репозиторий для каждой сущности отдельно?

Общее правило при использовании шаблона репозитория заключается в том, что для каждого первичного типа сущности должен быть один класс репозитория. Может ли EmployeeContacts жить независимо от Employee? Если так, у них должен быть свой собственный репозиторий. Они всегда связаны с Сотрудником? Если это так, управляйте ими с помощью самого репозитория Employee.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...