ASP.NET MVC, используя шаблон репозитория


Я просто пытаюсь использовать ASP.NET MVC, используя шаблон репозитория. Я делаю что-то неправильно здесь?

Модель - содержит модели

public class Contact
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string EmailAddress { get; set; }
}

Репозитария интерфейса - интерфейс

public interface IContactRepository
{
    void Create(Contact contact);
    void Delete(int contactId);
    void Save(Contact contact);
    Contact Retrieve(int contactId);
    IEnumerable<Contact> Select();
}

Класс репозитория

public class ContactRepository : IContactRepository
{
    private AddressBookDb addressBookdb = new AddressBookDb();

    public void Create(Contact contact)
    {
        addressBookdb.Contacts.Add(contact);
        addressBookdb.SaveChanges();
    }

    public void Save(Contact contact)
    {
        Delete(contact.Id);
        Create(contact);
    }

    public void Delete(int contactId)
    {
        Contact contact = Retrieve(contactId);
        if (contact != null)
        {
            addressBookdb.Contacts.Remove(contact);
            addressBookdb.SaveChanges();
        }
    }

    public Contact Retrieve(int contactId)
    {
        return addressBookdb.Contacts.FirstOrDefault<Contact>(c => c.Id == contactId);
    }

    public IEnumerable<Models.Contact> Select()
    {
        return addressBookdb.Contacts.ToList<Contact>();
    }
}

Класс контроллера

public class ContactController : Controller
{
    IContactRepository contactRepository = null;
    public ContactController() : this (new ContactRepository())
    {

    }

    public ContactController(IContactRepository contactRepository)
    {
        this.contactRepository = contactRepository;
    }

    [HttpPost]
    public ActionResult Edit(Contact contact)
    {
        if (ModelState.IsValid)
        {
            contactRepository.Save(contact);
            return RedirectToAction("Index");
        }
        return View(contact);
    }
}


21471
5
задан 24 ноября 2011 в 10:11 Источник Поделиться
Комментарии
2 ответа

У меня есть очень хорошее решение для вас. Ниже представлены две записи в блоге:


Универсальный шаблон репозитория - структура лица, ASP.NET MVC и блок
Треугольник Тестирования


Как работать с родовой репозиториев ASP.NET MVC и модульное тестирование
Их Глумливые

Что я могу предложить еще такой:

Реализует Интерфейс IDisposable:

Реализовать IDisposable на свой репозиторий и распоряжаться ими по своему контроллера путем переопределения контроллера.Метод Dispose. Образец:

IContactRepository:

public interface IContactRepository : IDisposable {

//same as above
}

Добавьте приведенный ниже код на вашу ContactRepository класс:

private bool disposed = false;

protected virtual void Dispose(bool disposing) {

if (!this.disposed)
if (disposing)
addressBookdb.Dispose();

this.disposed = true;
}

public void Dispose() {

Dispose(true);
GC.SuppressFinalize(this);
}

На геймпаде, добавьте этот код:

protected override void Dispose(bool disposing) {

contactRepository.Dispose();

base.Dispose(disposing);
}

3
ответ дан 2 января 2012 в 01:01 Источник Поделиться

Пару вещей я бы изменил:


  1. Сделать спасет ли это необходимо, чтобы создать или изменить себя.

  2. Не удалить и создать заново в том же. Он будет возиться с реляционными данными, как Ренато сказал.

  3. В вернуть способ вернуть метода singleordefault - только одна запись должна иметь уникальный идентификатор. Тогда давай контроллер проверить на null вместо того, чтобы попробовать/поймать, который вам понадобится примерно один звонок, так как это будет бросать исключение, если запись не была возвращена. Метода firstordefault делает его похожим вы не уверены, там будет только одна запись; также в зависимости от заказа он может возвращать разные записи в зависимости от условий.

  4. Вы могли бы сделать вы сохраните метод возвращает значение типа bool, чтобы остановить дБ сторону вещей, бросая ошибки и сбои сайта. Тогда вы можете сделать следующее:

    [HttpPost]
    public ActionResult Edit(Contact contact)
    {
    if ((ModelState.IsValid) && (contactRepository.Save(contact)))
    {
    return RedirectToAction("Index");
    }
    return View(contact);
    }

1
ответ дан 5 декабря 2011 в 09:12 Источник Поделиться