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

Silverlight 如何在编译期间拦截RIA工具生成的域服务?,silverlight,wcf-ria-services,silverlight-5.0,Silverlight,Wcf Ria Services,Silverlight 5.0,目前,可以通过“CodeProcessor”类定制在RIA服务的客户端生成实体的方式。对于任何需要客户端生成的域服务,可以使用代码处理器拦截每个实体/命名空间并进行调整等 但在我的例子中,我需要实际截取哪些域服务将首先生成 我注意到在DomainServiceDescription中有一个静态私有只读domainServiceMap,其中包含所有生成的服务。然而,在我可以找到的编译期间,没有办法访问这个映射 我希望在某个地方有一个钩子,我可以与服务地图交互,这样我就可以在开始生成之前从集合中删除

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

但在我的例子中,我需要实际截取哪些域服务将首先生成

我注意到在DomainServiceDescription中有一个静态私有只读domainServiceMap,其中包含所有生成的服务。然而,在我可以找到的编译期间,没有办法访问这个映射

我希望在某个地方有一个钩子,我可以与服务地图交互,这样我就可以在开始生成之前从集合中删除项目


有什么想法吗?

代码处理器似乎是一种老方法,我认为它仅限于生成实体。在较新的版本中,我们可以为所有不同的部件指定基于T4的生成器

在WebProejct或包含代码生成类的类库中从Nuget安装。 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项目,瞧。它可能会崩溃。要对此进行调试,我们可以打开VisualStudio的另一个实例,在此新实例中的生成器上设置断点,附加到VisualStudio的第一个实例并重新编译Silverlight项目

代码处理器似乎是一种老方法,我认为它仅限于生成实体。在较新的版本中,我们可以为所有不同的部件指定基于T4的生成器

在WebProejct或包含代码生成类的类库中从Nuget安装。 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项目,瞧。它可能会崩溃。要对此进行调试,我们可以打开VisualStudio的另一个实例,在此新实例中的生成器上设置断点,附加到VisualStudio的第一个实例并重新编译Silverlight项目