Используя nHibernate и шаблон репозитория, нужно какое-то направление

Хорошо, я только начинаю переходить в спящий режим (свободно использую).

Что мне в нем нравится, так это то, что я могу использовать шаблон репозитория (читайте об этом в блоге nhibernate rhino).

В основном, используя дженерики, я могу создавать методы, которые будут работать во ВСЕХ моих таблицах базы данных.

 public interface IRepository<T>
    {
        T GetById(int id);
        ICollection<T> FindAll();
        void Add(T entity);
        void Remove(T entity);
    }


 public class Repository<T> : IRepository<T>
    {

        public ISession Session
        {
            get 
            { 
                return SessionProvider.GetSession(); 
            }
        }


        public T GetById(int id)
        {
            return Session.Get<T>(id);
        }

        public ICollection<T> FindAll()
        {
            return Session.CreateCriteria(typeof(T)).List<T>();
        }

        public void Add(T t)
        {
            Session.Save(t);
        }

        public void Remove(T t)
        {
            Session.Delete(t);
        }    

    }

Затем я наследую класс Repository и могу добавить методы, специфичные для этой сущности.

При попытке добавить метод обновления кто-то упомянул, что шаблон репозитория должен воздействовать на коллекции? Я здесь неправильно смотрю? Почему я не могу создать метод обновления?

Я попытался добавить метод обновления, но не понимаю, как я буду обрабатывать сеанс и обновлять базу данных?

Мне нужно единое место для всего моего доступа к базе данных для каждого объекта, поэтому UserRepository будет иметь все основные CRUD, а затем, возможно, некоторые другие методы, такие как GetUserByEmail () и т. Д.


person mrblah    schedule 18.08.2009    source источник


Ответы (2)


Не используйте шаблон репозитория - используйте вместо него шаблон UnitOfWork и передайте определенный запрос ICriteria в ISession. По сути, шаблон Repo обертывает что-то, что не нужно оборачивать с помощью NH.

см. http://ayende.com/Blog/archive/2009/04/17/repository-is-the-new-singleton.aspx для получения дополнительной информации.

person mcintyre321    schedule 18.08.2009
comment
Я считаю ошибочным предполагать, что шаблоны единиц работы и репозитория взаимозаменяемы, поскольку они решают разные проблемы. Я знаком с этим сообщением Айенде, и хотя я действительно думаю, что в нем определенно есть доля правды, пожалуйста, помните, что это всего лишь мнение, и его не следует представлять как факт. - person Paul Batum; 19.08.2009
comment
хорошо, но если вы изучаете NH, начинать с шаблона Repository (с промыванием при каждом вызове repo.Update ()) - плохая привычка. Или вы можете написать какой-то странный гибрид Repo и UoW, который выглядит как Repo, но его все еще нужно очистить, или упустите величие, которое представляет собой отключенный UoW. Мне кажется, что Хомстед взял несколько уроков, делает свои первые шаги и идет немного неправильным путем в том, что ему нужно, и каков лучший способ изучить NH. - person mcintyre321; 19.08.2009
comment
Но да, ты прав, я сделал это заявление, похожее на общее. паттерн репо полезен в определенных обстоятельствах. Я должен был сказать ИМО, в этом случае шаблон Repo что-то оборачивает ... - person mcintyre321; 19.08.2009
comment
Сбрасывать данные при каждом обращении к вашему репо - плохая идея. Вот почему я сказал, что эти два шаблона решают разные проблемы. Репозитории служат архитектурным швом, который дает понять, где и как ваше приложение извлекает и вставляет объекты, в то время как ISession - это ваша единица работы, которая отслеживает изменения. ИМХО, вам следует еще раз взглянуть на шаблон репозитория, такой как тот, который используется в S # arp Architecture - потому что изображение, которое у вас есть (с промывкой, обрабатываемой репозиторием), является очень плохой реализацией. - person Paul Batum; 19.08.2009
comment
Шаблон репозитория, насколько я понимаю, позволяет вам рассматривать хранилище данных, как если бы оно было списком объектов в памяти (из martinfowler.com/eaaCatalog/repository.html/... Объекты можно добавлять в репозиторий и удалять из него, как они могут из простой коллекции объектов). При доступе к простой коллекции объектов из другого сеанса изменения будут отражены немедленно, поэтому репозиторий должен быть сброшен. Опять же, это просто моя интерпретация определения репозитория в соответствии с книгой Фаулера / DDD, но ни один из них не упоминает промывку. IMO Repo требует промывки! = Стандартный репозиторий. - person mcintyre321; 19.08.2009
comment
Опять же, это просто моя интерпретация определения репозитория в соответствии с книгой Фаулера / DDD, но ни один из них не упоминает промывку. IMO Repo требует промывки! = Стандартный репозиторий. Кроме того, такой репозиторий нельзя использовать для прозрачного переключения на веб-службу или аналогичные вещи, которые не участвуют в UoW. - person mcintyre321; 19.08.2009

Возможно, вы ослышались или кто-то ошибся - шаблон «Репозиторий» должен раскрывать поведение как коллекцию, а не работать с коллекциями. Подобно тому, как вы можете добавлять, удалять и искать элементы в коллекции, ваш репозиторий предлагает операции сохранения, удаления и поиска, которые работают с вашей базой данных.

Я предлагаю вам загрузить код для архитектуры S # arp. Он включает в себя реализацию репозитория, которую вы можете легко использовать повторно. Если вы не хотите принимать зависимости, по крайней мере, вы можете потратить некоторое время на изучение их реализации, чтобы лучше понять, как подойти к ней самостоятельно.

person Paul Batum    schedule 18.08.2009