Объекты Nhibrnate POCO со связями, но без коллекций - уровень Мутли - PullRequest
0 голосов
/ 08 октября 2009

Это немного концептуальных вопросов, но я думаю, что это правильное место, чтобы задать его.

Я работаю с NHibernate в течение некоторого времени, но мне трудно использовать коллекции в объектах POCO. 1. Я думаю, что концепция прокси хороша, но когда вы хотите использовать ее в многоуровневой архитектуре, это становится проблемой. 2. Я хочу добавить бизнес-логику на любой тип запроса от БД. например, ограничения авторизации и т.д .. 3. Я хотел бы добавить некоторую бизнес-логику, когда добавляю или удаляю сущность из коллекции.

и есть еще несколько причин, по которым у меня возникают проблемы с коллекциями и прокси.

Я подумал, что, возможно, есть способ использовать объект POCO без каких-либо коллекций и позволить сервисному уровню обрабатывать подзапросы, ассоциации и т. Д ... Я понимаю, что коллекция необходима для работы Nhibernate, но как только я выйду из сервисного уровня, я хочу выровнять объекты и вынуть все коллекции. таким образом я могу реализовать свои собственные операции и бизнес-логику.

есть ли стандартный способ сделать это? мне нужно прикрепить и отсоединить объекты? как мне создать объект DTO из объекта POCO и скопировать поля и т.д ...

У кого-нибудь есть для этого лучшие практики, и он сделал то же самое?

Я мог бы просто создать объекты POCO без каких-либо отношений и только дать nhibernat знать об этих отношениях через отображение. затем, используя сеанс, я могу контролировать ассоциации между объектами.

Спасибо, Ноам

1 Ответ

0 голосов
/ 08 октября 2009

Если вы хотите иметь полный контроль над своей коллекцией, я могу предложить вам такой подход:

  1. Вы используете коллекцию только для чтения:

    общедоступная виртуальная коллекция ReadOnlyCollection ChildActions { получить { вернуть новый ReadOnlyCollection (новый список (childActions)); } }

  2. Для картирования можно использовать фоновое поле

    личный ISet childActions;

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

    childActions = new HashedSet ();

  4. Для добавления и удаления предметов из коллекции вы можете использовать методы:

    public virtual void AddChildAction(ActionOnClient actionToAdd)
    {
        //some logic here
    
        childActions.Add(actionToAdd);
    }
    public virtual void AddChildAction(ActionOnClient actionToAdd)
    {
        //some logic here
    
        childActions.Remove(actionToAdd);
    }
    

    Такой подход даст вам полный контроль над вашими коллекциями. Надеюсь, это поможет

...