Как использовать тип с тем же именем другого типа в другой сборке, на которую есть ссылки?

У меня есть абсурдная ситуация (не вините меня, это стороннее программное обеспечение), где мне нужно иметь две ссылки (Erp.Contracts.BO.Quote и Erp.Contracts.BO.SalesOrder), но тип Erp.Tablesets. QuoteQtyRow определен в обеих сборках!

Как я могу использовать их в коде?

void Absurdity()
{
    Erp.Tablesets.QuoteQtyRow qqr_Quote = null; //<-- my intention is to use the one from the quote assembly here.
    Erp.Tablesets.QuoteQtyRow qqr_SO = null; //<-- my intention is to use the one from the sales order assembly here.
}

Компилятор выдает ошибку. А именно: "Тип" Erp.Tablesets.QuoteQtyRow "существует в обеих сборках".

РЕДАКТИРОВАТЬ: ОГРАНИЧЕНИЯ:

  1. У меня нет гибкости в использовании внешнего псевдонима, как это предусмотрено в этом классе ответа с тем же именем в двух сборках (намеренно). Я ограничен средой, поставляемой сторонним программным обеспечением. Мне по сути нужен способ провести различие в теле метода.

  2. Я понимаю, что могу полностью избежать этой проблемы, используя ключевое слово dynamic, но я ищу возможное строго типизированное решение.

  3. Может быть, и не будет решения, но я хочу исчерпать все свои ресурсы, прежде чем отказаться от проблемы.

1 ответ

Решение

Epicor ERP использует инструмент для объединения таблиц из БД в наборы данных, а затем в бизнес-объекты. Этот бизнес-объект описан в сборке контракта, но, как вы обнаружили, когда вы используете два бизнес-объекта, которые ссылаются на одну и ту же таблицу, вы сталкиваетесь с проблемами. Это чаще всего проблема с таблицами SerialNumber.

Из ваших заметок я понимаю, что вы предоставляете код тела метода в Директиве о методе или Директиве о данных в приложении Epicor ERP. Он вводится на клиенте и сохраняется в базе данных, но генерирует код на сервере в папке Deployment\Server\BPM\Sources\BO и компилируется в папку Deployment\Server\Customization\BO.

Невозможно указать псевдоним для указанной библиотеки DLL в элементе рабочего процесса "Выполнение пользовательского кода" конструктора BPM. Исправление запрашивается в SCR 148549. Нет файла проекта, который вы бы могли редактировать, и даже если бы каждый раз был включен и отключен BPM, он был бы восстановлен.

Однако, если вы используете элемент рабочего процесса Invoke External Method, вы можете создать свою собственную dll и поместить ее в папку Deployment\Server\Customization\Externals. Для этого:

  • Выберите Действия> Создать программные интерфейсы для вашего метода в разделе Обслуживание директив метода для вашего BPM и скопируйте код.
  • Создайте новый проект библиотеки классов в Visual Studio
  • Вставьте скопированный код в файл.cs
  • Добавить сборки - ссылки на каркас:
    • System.Data.Entity
    • System.ServiceModel
    • System.Transactions
  • Добавить ссылки на файлы в
    • Bin\Epicor.ServiceModel.dll
    • Сборки \Epicor.Ice.dll
    • Сборки \Epicor.System.dll
    • Сборки \Ice.Data.Model.dll
    • Сборки \Erp.Data.910100.dll
  • И добавить ссылку на БО БП, т. Е.
    • Сборки \Erp.Contracts.BO.Quote.dll
  • Убедитесь, что для всех ссылок для параметра Копировать локально установлено значение false.
  • Наследовать от Ice.ContextBoundBase<Erp.ErpContext>
  • Добавить конструктор, который принимает контекст public MyQuote (Erp.ErpContext ctx) : base(ctx){ }

Вы не можете скопировать и вставить тело "Execute Custom Code", так как у вас не будет доступа к переменным строки tt, все они находятся в ds.

Другие вопросы по тегам