2014-11-18 2 views
2

Пусть У меня есть класс с именем «Клиент», и это имеет смысл есть метод класса, как:NHibernate шаблон для логически связанных объектов без прохождения ISession везде

void AddOrder(Item item, int quantity, decimal pricePerUnit) 

Метод AddOrder бы концептуально создать новый записей в базе данных.

С точки зрения C#, нет проблемы с сигнатурой метода выше, но для целей NHibernate он должен иметь доступ к ISession для сохранения новых объектов в базе данных.

Какова подходящая модель для достижения этой цели, не делая каждый метод в моих постоянных классах параметром ISession?

Должен ли я спуститься с моих постоянных классов от общего абстрактного предка, который получает текущий экземпляр ISession, используя инъекцию зависимостей? (т. е. реализовать тонкую оболочку для ISession, которая действует как фабрика объектов, которая обрабатывает все запросы на создание или выборку)

Есть ли хороший шаблон для этого?

PS - Я знаю, что я не хочу использовать шаблон хранилища. Это слишком бесплатная форма для очень сложной модели данных.


Разъяснение:

Модель данных в вопросе является система учета двойной записи. Большинство разработчиков имеют нулевые знания о механизме двойного входа и не хотят этого. Итак, что я хотел бы сделать, это предоставить методы кода, которые указывают разработчику «Что я могу сделать с этим объектом?», а не только с использованием свойств, которые являются обычным способом NHibernate.

Я использовал NHibernate сейчас для целого ряда проектов, и я все время возвращаюсь к выводу, что я действительно должен поместить все взаимодействия данных для очень сложных систем за высокоструктурированным API и единственными людьми, которые работают над back-end этого API должен быть экспертом по модели данных/персистентности. Программисты, которые просто взаимодействуют с данными, просто знают, как использовать API. Это не тот вывод, который я действительно хочу сделать, так как он добавит достаточное количество накладных расходов на разработку для некоторых наших систем. (Конечно, это путь к сервис-ориентированной архитектуре и просто может быть «дан» в эти дни для больших проектов)

+0

Вы отрицаете многие преимущества, которые могут быть достигнуты с помощью O/RM, заставляя все изменения сохраняться в базе данных немедленно. Можете ли вы пояснить немного больше? Я бы немного интересовался вашей объектной моделью, если вы считаете, что для NHibernate слишком сложно справиться, не изобретая колесо. – Michael

+0

@Michael _When_ ISession.Save() вызывается не моя проблема. Меня больше беспокоит то, как разработчики взаимодействуют с моделью персистентности в своем коде, не требуя, чтобы они стали экспертами в маленьких «кусочках». Добавление примера для разъяснения. –

ответ

0

Если Customer является постоянным классом, вам не нужно будет обращаться к объекту сеанса для добавления новый Item запись. У клиента должно быть свойство коллекции Items, сопоставленное как «имеет много или многие-многие» ассоциации с параметром каскадного сопоставления, установленным как «сохранить» или «все».

Метод AddItem() должен просто добавить экземпляр Item в коллекцию Items объекта Customer. После того, как вы совершите транзакцию NHibernate (обычно это делается в фильтре действий, http-модуле или другом классе инфраструктуры), NHibernate сохранит все записи.

Если Customer - это новый экземпляр класса, вам необходимо будет позвонить по методу Save текущего экземпляра ISession. Вы также должны вызвать метод Remove для удаления постоянного объекта.

Обычно я создаю очень общий простой сервис DAO, чтобы добавлять/удалять/получать зачетные корни.Каскадирование и выборка отслеживают связанные объекты. Для сложного запроса вы можете создавать объекты запроса, которые обращаются к экземпляру ISession через инъекцию зависимостей.

Редактировать: похоже, что вы хотите, чтобы объекты сохранялись сразу. Я бы порекомендовал держать транзакции короткими, а не ссылаться и ругать сеанс вручную. Хотя это возможно сделать позже, обычно вы отрицательно относитесь к преимуществам целостности данных ORM.

+0

Я считаю, что вы правы, что отображение является единственным способом. –

Смежные вопросы