Как использовать тип с тем же именем другого типа в другой сборке, на которую есть ссылки?
У меня есть абсурдная ситуация (не вините меня, это стороннее программное обеспечение), где мне нужно иметь две ссылки (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 "существует в обеих сборках".
РЕДАКТИРОВАТЬ: ОГРАНИЧЕНИЯ:
У меня нет гибкости в использовании внешнего псевдонима, как это предусмотрено в этом классе ответа с тем же именем в двух сборках (намеренно). Я ограничен средой, поставляемой сторонним программным обеспечением. Мне по сути нужен способ провести различие в теле метода.
Я понимаю, что могу полностью избежать этой проблемы, используя ключевое слово dynamic, но я ищу возможное строго типизированное решение.
Может быть, и не будет решения, но я хочу исчерпать все свои ресурсы, прежде чем отказаться от проблемы.
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.