silverlight - 如何拦截RIA工具在编译过程中生成的域服务?

标签 silverlight wcf-ria-services silverlight-5.0

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

但就我而言,我需要实际拦截哪些域服务将首先生成。

我注意到在DomainServiceDescription中有一个静态私有(private)只读domainServiceMap,其中包含正在生成的所有服务。但是,我找不到在编译时访问此映射的方法。

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

有什么想法吗?

最佳答案

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

安装RIAServices.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 项目,瞧。它可能会崩溃。要调试此问题,我们可以打开另一个 Visual Studio 实例,在这个新实例中的生成器上设置断点,附加到 Visual Studio 的第一个实例并重新编译 Silverlight 项目。

关于silverlight - 如何拦截RIA工具在编译过程中生成的域服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10631093/

相关文章:

silverlight - Silverlight 5的自动化UI测试工具

visual-studio - 错误 : The project type is not supported by this installation

Silverlight 单元测试

c# - WCF RIA 服务——加载所有数据后采取行动

c# - WCF ria 服务返回复杂类型列表

c# - 我们如何在将数据绑定(bind)到 Windows Phone 中的文本 block 时处理空值

silverlight - 墓碑后在页面初始化时获取 WP8 Silverlight 应用程序中的屏幕高度

c# - 如何在从 Windows Phone 7 调用的 WCF 服务中配置 session ?

c# - Datagrid 不刷新更改的数据

silverlight - 找不到包含 BusyIndi​​cator 的程序集