如何在编译期间拦截RIA工具生成的域服务?

时间:2012-05-17 06:48:00

标签: silverlight wcf-ria-services silverlight-5.0

目前,可以通过“CodeProcessor”类自定义如何在RIA服务的客户端生成实体。对于需要客户端生成的任何域服务,代码处理器可用于拦截每个实体/命名空间并进行调整等。

但在我的情况下,我需要实际拦截哪些域服务将在一开始就生成。

我注意到在DomainServiceDescription中有一个静态的私有只读domainServiceMap,它包含正在生成的所有服务。但是,在我可以找到的编译时间内无法访问此映射。

我希望(手指交叉)在某个地方有一个钩子,我可以与该服务地图互动,以便我可以在开始生成之前从集合中删除项目。

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

CodeProcessor似乎是旧的方式,我认为它仅限于生成实体。在较新的版本中,我们可以为所有不同的部分指定基于T4的生成器。

从WebProejct中的Nuget或将包含代码生成类的类库中安装RIAServices.T4。    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#,它将为您完成。

您可以从MyCSharpClientCodeGenerator中提供其他4种不同的代码生成器。

现在要把它全部搞定,在Silverlight项目文件中我们需要告诉RIA使用我们的生成器。我们必须编辑Silverlight项目并在LinkedServerProject之后的第一个PropertyGroup中添加以下元素(顺序无关紧要,我只是说作为参考)。

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

重新编译Silverlight项目并瞧。它可能会崩溃。要调试这个,我们可以打开另一个Visual Studio实例,在这个新实例的Generators上设置断点,附加到Visual Studio的第一个实例并重新编译Silverlight项目。