Ваш браузер устарел, не поддерживает современные веб-стандарты и представляет угрозу Вашей безопасности. Для комфортной работы с порталом, пожалуйста, установите современыый браузер.
Портал технической поддержки

Отображение карточки в объектную модель DocsVision 5

Комментарии

Комментариев: 12

  • Использование метода - расширения вида
            internal static ObjectCollection<T> GetSection<T>(this BaseCard card, Guid sectionID) where T : BaseCardSectionRow
            {
                return (ObjectCollection<T>)card.GetSection(sectionID);
            }

    выглядит всё равно как-то... не очень корректно (хотя и работает с учётом того, что все ObjectProperty карточки, представляющие секции, зарегистрированы в объектной модели).

    0
    Действия с комментариями Постоянная ссылка
  • Надо смотреть, как в новой объектной модели реализована карточка, стандартно GetObject точно ничего не сбрасывает (иначе бы не работали любые решения, н-р, то же делопроизводство).

    Стандартно в этих решениях все делается примерно так:

    1. Компонент наследуется от BaseCardControl (UI редактировать без лицензии не получится, но код писать никто не мешает, и при реальной работе уже будет использоваться лицензия навигатора).

    2. В методе protected override void OnObjectContextInitializing(ObjectContextEventArgs e) добавляем в контекст собственные фабрики преобразователей / сервисов (через IObjectMapperFactoryRegistry / IServiceFactoryRegistry).

    3. Делаем свойство для объекта как раз приведенным способом, можно разве что добавить получение через CardData, если она задана:
    private MyCard MyCard
    {
     get
     {
      if (CardData != null)
       return ObjectContext.GetObject<MyCard>(CardData.Id);
      // ... далее получение через BaseObject ...
     }
    }

    4. И, наконец, переопределяем стандартный BaseObject:
    public override BackOffice.ObjectModel.BaseCard BaseObject
    {
     get { return MyCard; }
    }

    0
    Действия с комментариями Постоянная ссылка
  • Евгений, спасибо, буду пробовать.

    Тогда вдогонку ещё один вопрос - каким образом нужно переопределить визуальный компонент для собственной карточки - справочника, чтобы он не ругался на отсутствие секции SystemInfo (т. к. вид и состояние справочнику по факту не нужны)?

    0
    Действия с комментариями Постоянная ссылка
  • Компонент модели можно сразу унаследовать от BaseDictionaryCard, там как раз подобный код:
    public override BaseCardSystemInfo SystemInfo
    {
     get
     {
      return null;
     }
    }

    (и то же самое для Processes).

    А в компонентах самих справочников ничего специального не нахожу, н-р, справочник сотрудников просто пользуется объектом 
    private Staff Staff
    {
     get
     {
      return base.ObjectContext.GetObject<Staff>(CardLib.CardDefs.RefStaff.ID);
     }
    }
    т.е., всегда получает справочник по его Id типа.

    0
    Действия с комментариями Постоянная ссылка
  • Нет, это я прекрасно знаю (кстати, от BaseDictionaryCard не унаследуешься, т.к. конструкторы - то помечены модификатором internal).

    Хотелось бы понять, что нужно переопределить в классе - компоненте карточки, унаследованном от BaseCardControl, чтобы при активации карточки он не пытался найти у неё секцию System (т. к. если для справочников сейчас указывать визуальным компонентом BaseCardControl, то при активации он будет ругаться, что у карточки отсутствуют вид и состояние, которые у справочника попросту отсутствуют).

    Когда я "решал" подобную проблему ранее (без учёта Вашего совета), я просто добавлял в каждый справочник секцию System, а потом занимался шаманскими танцами для проставления вида и состояния в экземпляр карточки.

    0
    Действия с комментариями Постоянная ссылка
  • А собственно и все, кроме пустых конструкторов с вызовом базового и return null для SystemInfo / Processes в этом классе больше ничего нет.
    Т.е., для своего справочника в модели можно просто сделать аналогичные свойства для этих двух секций.

    0
    Действия с комментариями Постоянная ссылка
  • Дмитрий, почему решили разрабатывать собственную схему карточки?

    Как я понимаю, за этим следует ряд проблем: без перезапуска IIS и ДВ сервисов не внесешь изменения в схему карточки, написание отображения в новую объектную модель, возможно что-то еще..

    Что скажете по поводу выбранного решения, оно оправдывает себя?

    Также подскажите, не возникало ли у Вас проблем с вынесением кода в отдельные библиотеки, в этом случае библиотеки нужно распространить на все клиентские машины?

    0
    Действия с комментариями Постоянная ссылка
  • Александр, добрый день.
    Решение разрабатывать собственную схему данных было принято в связи с тем, что эта самая схема чересчур специфична и не укладывается в рамки стандартного решения. Динамика тут не поможет никак, только сделает реализацию более сложной в разработке и сопровождении.
    Проблем с вынесением кода во внешнюю библиотеку не имеем, сейчас преобразуем программную реализацию решения в целую иерархию библиотек для удобства дальнейшей разработки.
    Да, сборки необходимо распространять на клиентские компьютеры, за это отвечает библиотека карточек, её компонент и инсталлятор, который раскидывает сборки при запуске с сервера.
    0
    Действия с комментариями Постоянная ссылка
  • Лично для меня принятое решение оправдало себя на все сто процентов.
    0
    Действия с комментариями Постоянная ссылка
  • Avatar
    Grigoriy Chekh

    Коллеги подскажите удалось побороть чтобы справоник не ругался на отсутствие секции SystemInfo (т. к. вид и состояние справочнику по факту не нужны)

    0
    Действия с комментариями Постоянная ссылка
  • Наследуйте справочник не от BaseCard, а от DocsVision.BackOffice.ObjectModel.BaseDictionaryCard, как и писал выше.

    0
    Действия с комментариями Постоянная ссылка
  • В версии 5.4.2642 от BaseDictionaryCard по-прежнему отнаследоваться не получится ввиду того, что оба конструктора этого класса помечены атрибутом internal (возможно, одно из накопительных обновлений решило проблему?).

    Пример реализации (по всем канонам) выложил на pastebin: http://pastebin.com/NWgs0ezS .

    0
    Действия с комментариями Постоянная ссылка

Войдите в службу, чтобы оставить комментарий.