Пусть У меня есть класс с именем «Клиент», и это имеет смысл есть метод класса, как: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. Это не тот вывод, который я действительно хочу сделать, так как он добавит достаточное количество накладных расходов на разработку для некоторых наших систем. (Конечно, это путь к сервис-ориентированной архитектуре и просто может быть «дан» в эти дни для больших проектов)
Вы отрицаете многие преимущества, которые могут быть достигнуты с помощью O/RM, заставляя все изменения сохраняться в базе данных немедленно. Можете ли вы пояснить немного больше? Я бы немного интересовался вашей объектной моделью, если вы считаете, что для NHibernate слишком сложно справиться, не изобретая колесо. – Michael
@Michael _When_ ISession.Save() вызывается не моя проблема. Меня больше беспокоит то, как разработчики взаимодействуют с моделью персистентности в своем коде, не требуя, чтобы они стали экспертами в маленьких «кусочках». Добавление примера для разъяснения. –