Генерация кода служб RIA в приложении Silverlight

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

Позволь мне объяснить.


У меня есть инфраструктура приложения для Silverlight. Этот пакет Infra включает в себя 3 службы домена (RIA) (аутентификация, ведение журнала, обнаружение служб) на стороне сервера - Infra.Web.dll и dll silverlight - ClientInfra.dll. который реализует аутентификацию пользователя при запуске приложения и некоторые другие базовые классы (например, BaseApp и BaseView), в то время как Infra.Web.dll определяется как ссылка на службы WCF RIA для ClientInfra.dll .

Сейчас я разрабатываю демонстрационное приложение Silverlight, чтобы протестировать свою инфраструктуру. Я создал

DemoApp.Web, который ссылается на Infra.Web.dll (для получения услуг инфраструктуры)

и 2 проекта silverlight:

DemoApp.Data, который определяет DemoApp.Web.dll как ссылку на службы WCF RIA, чтобы получить сгенерированный код и ссылки на ClientInfra.dll.

DemoApp - это фактическое приложение Silverlight, которое ссылается на ClientInfra.dll.

Проблема в том, что когда я пытаюсь использовать одну из служб RIA из приложения silverlight, у меня возникает ошибка, что классы доменных служб определены как в ClientInfra.dll, так и в DemoApp.Data. . Насколько я понимаю, проблема в том, что код из Infra.Web.dll был сгенерирован дважды: сначала для ClientInfra.dll, затем для DemoApp.Data < / сильный>.

Есть ли способ избежать генерации кода для типов, которые уже упоминаются, как в моем случае, когда ClientInfra.dll уже имеет сгенерированные инфра-сервисы, поэтому нет необходимости создавать его снова в DemoApp. Данные?

Постараюсь сделать свой вопрос проще. Как я могу избежать генерации типов служб ria (в silverlight) тех типов, которые уже были созданы для моей DLL, на которую имеется ссылка? Дублирование генерации типов вызывает ошибку CS0433, что одни и те же типы определены в двух разных dll.

Я обнаружил интересный факт. Если я ссылаюсь на ClientInfra.dll непосредственно из DemoApp (проект приложения silverlight), то типы данных, которые уже были созданы в ClientInfra.dll не генерируются лишний раз. Но если я ссылаюсь на ClientInfra.dll из DemoApp.Data, я получаю генерацию кода дублированных типов с предупреждением компиляции о том, что одни и те же типы определены как в указанной DLL, так и в в сгенерированном коде.


person Daniel Kabzon    schedule 31.12.2012    source источник


Ответы (2)


Я нашел следующее в документации msdn

Проанализируйте все сборки, созданные или на которые ссылается проект среднего уровня, на предмет классов обслуживания домена, классов сущностей или общего кода.

Службы RIA проверяют существующие члены перед созданием прокси-класса. Любой член, который уже определен, не будет создан в прокси-классе.

Это означает, что мой сценарий должен работать, как я ожидал!

Чтобы проверить процесс генерации кода, я установил для проекта MSBuild настройку подробности вывода (Инструмент-> Параметры-> Проекты и решения-> Сборка и запуск) на Нормальный (вместо Минимального по умолчанию). Затем после компиляции я обнаружил, что проекту DemoApp.Data не удалось загрузить ClientInfra.dll, который включает уже сгенерированные прокси. Таким образом, генератор просто проигнорировал это и сгенерировал все классы с самого начала.

Я решил эту проблему с загрузкой, и теперь все работает нормально.

person Daniel Kabzon    schedule 07.01.2013
comment
Это безумно количество хорошей информации, скрытой в минимальной конфигурации. Неверная ссылка на проект зависимости, поэтому зависимость молча не удалось построить и никаких ошибок! Спасибо за совет! - person Nuno Agapito; 23.10.2013

У меня аналогичная инфраструктура, но я предоставил DomainServices с помощью SOAP и использую службы в других приложениях, поэтому я должен сделать то же самое со своими проектами.

person Ricardo Pons    schedule 05.01.2013
comment
Спасибо за идею. Проблема в том, что у меня десятки приложений, и я не хочу, чтобы все они использовали одни и те же услуги, это создает для меня узкое место. Я бы хотел, чтобы каждое приложение само обслуживалось. - person Daniel Kabzon; 06.01.2013