Хранилища / Ленивая загрузка / Постоянство - PullRequest
3 голосов
/ 12 апреля 2011

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

public class Category
{
  string Name {get;set;}
  Category Parent {get;set;}
  IList<Category> Children {get;set;}
}

public class Transaction
{
  Category Owner {get;set;}
  string Name
  ... bla bla
}

В этой конкретной модели Домена эти два не образуют единую совокупность.Таким образом, у меня есть две стандартные IRepository реализации для каждой из двух сущностей.

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

Вопрос второй : Аналогичным образом, при обновлении объекта (агрегата) часто требуется сохранять / изменять / удалять проверки на различных компонентах.Предположительно, это только разумно выполнимо, когда у вас есть единица работы, которая буферизует изменения и фиксирует только тогда, когда все проверки пройдены успешно?

Вопрос третий : загрузка одной категории приводит к целому дереву объектовзагружаться, когда не используется ленивая загрузка.Чтобы ограничить это, единственная реальная возможность - реализовать отложенную загрузку и / или отслеживание изменений в ваших сущностях?

1 Ответ

4 голосов
/ 12 апреля 2011

Для всех ваших трех вопросов я бы порекомендовал вам реализовать шаблон UnitOfWork. Я обычно использую IUnitOfWork, который является частью моих репозиториев. Когда я хочу работать с более чем одним из моих репозиториев, я внедряю (один и тот же) UnitOfWork во все, с чем я хочу работать (это один из способов, которые я предпочитаю). Затем, когда вся работа завершена, я вызываю Commit () в моем UnitOfWork, который выполняет изменения в контексте структур сущностей. UnitOfWork - это оболочка для контекста структур сущностей .

Вопрос первый: Реляционные проверки выполняются базой данных. Если что-то не получится, сущностная структура вызовет исключение, и вы должны обработать это на более высоком уровне приложения, давайте назовем его сервисным уровнем, где вы работаете с UnitOfWork.

Вопрос второй: Использовать шаблон UnitOfWork.

Вопрос третий: Вам следует использовать отложенную загрузку, если вы не хотите загружать все дерево объектов.

Repository:

    public interface IRepository<T>
{
    IUnitOfWork UnitOfWork { get; set; }
    IQueryable<T> All();
    void Delete(T item);
    void Save(T item);
    void Update(T item);
    IQueryable<T> Find(Func<T, bool> expression);
    void Attach(T item);        
}

UnitOfWork:

    public interface IUnitOfWork : IDisposable
{
    ObjectContext Context { get; set; }
    void Commit();
    bool LazyLoadingEnabled { get; set; }
    bool ProxyCreationEnabled { get; set; }
    string ConnectionString { get; set; }
}

ИЛИ здесь очень простая реализация шаблона UnitOfWork , чтобы вы начали (Это немного отличается от того, что я описал, так как UnitOfWork содержит репозитории, мой - наоборот).

...