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

В настоящее время можно настроить способ создания объектов на стороне клиента служб RIA с помощью класса CodeProcessor. Для любой доменной службы, которая требует генерации на стороне клиента, процессор кода может использоваться для перехвата каждой сущности/пространства имен и внесения корректировок и т. д.

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

Я заметил, что в DomainServiceDescription есть статическая приватная domainServiceMap только для чтения, которая содержит все создаваемые сервисы. Однако нет никакого способа получить доступ к этой карте во время компиляции, которую я могу найти.

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

Любые идеи?


person DarkwingDuck    schedule 17.05.2012    source источник


Ответы (1)


CodeProcessor кажется старым способом сделать это, и я думаю, что он ограничен только созданием объектов. В более новых версиях мы можем указать генераторы на основе T4 для всех различных частей.

Установите RIAServices.T4 из Nuget в WebProejct или библиотеку классов, которая будет содержать код классы поколения. PM>Установить-Пакет RIAServices.T4

Если у вас уже есть набор инструментов, просто добавьте ссылку на «Microsoft.ServiceModel.DomainServices.Tools.TextTemplate».

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

[DomainServiceClientCodeGenerator("MyCustomGenerator", "C#")]
public class MyCSharpClientCodeGenerator : CSharpClientCodeGenerator
protected override Microsoft.ServiceModel.DomainServices.Tools.TextTemplate.DomainContextGenerator DomainContextGenerator
    {
        get
        {
            //return base.DomainContextGenerator;
            return new MyDomainContextGenerator();
        }
    } 

Затем мы говорим R# реализовать для нас этот класс (MyDomainContextGenerator), который должен наследоваться от CSharpDomainContextGenerator. Конечно, если вы используете R#, он сделает это за вас.

У вас есть еще 4 разных генератора кода, которые вы можете предоставить из MyCSharpClientCodeGenerator.

Теперь, чтобы все это подключить, в файле проекта Silverlight нам нужно сообщить RIA, чтобы он использовал наш генератор. Мы должны отредактировать проект Silverlight и добавить следующий элемент в первую группу свойств сразу после LinkedServerProject (порядок не имеет значения, я просто говорю это для справки).

  <LinkedServerProject>..\SilverlightApplication2.Web\SilverlightApplication2.Web.csproj</LinkedServerProject>
  <RiaClientCodeGeneratorName>
    SilverlightApplication2.Web.RiaStuff.MyCSharpClientCodeGenerator,SilverlightApplication2.Web
  </RiaClientCodeGeneratorName>
</PropertyGroup>

Перекомпилируйте проект Silverlight и вуаля. Это может рухнуть. Чтобы отладить это, мы можем открыть другой экземпляр Visual Studio, установить точки останова на генераторах в этом новом экземпляре, подключиться к первому экземпляру Visual Studio и перекомпилировать проект Silverlight.

person Miguel Madero    schedule 17.05.2012