2

現在、「CodeProcessor」クラスを介して、RIA サービスのクライアント側でエンティティを生成する方法をカスタマイズできます。クライアント側の生成が必要なドメイン サービスでは、コード プロセッサを使用して各エンティティ/名前空間をインターセプトし、調整などを行うことができます。

しかし、私の場合は、どのドメイン サービスが最初に生成されるかを実際にインターセプトする必要があります。

DomainServiceDescription には、生成されるすべてのサービスを含む静的なプライベート読み取り専用 domainServiceMap があることに気付きました。ただし、コンパイル時にこのマップにアクセスする方法はありません。

生成を開始する前にコレクションからアイテムを削除できるように、そのサービス マップとやり取りできるフックがどこかにあることを (指を交差させて) 願っています。

何か案は?

4

1 に答える 1

4

CodeProcessor はそれを行う古い方法のようで、エンティティの生成のみに限定されていると思います。新しいバージョンでは、すべての異なる部分に対して T4 ベースのジェネレーターを指定できます。

Nugetから RIAServices.T4 を WebProejct またはコード生成クラスを含むクラス ライブラリにインストールします。PM> インストール パッケージ RIAServices.T4

ツールキットが既にある場合は、"Microsoft.ServiceModel.DomainServices.Tools.TextTemplate" への参照を追加するだけです。

次に、CSharpClientCodeGenerator から継承する必要があります。これは、実際には何も生成しませんが、RIA のプロパティの一部をオーバーライドして、どのジェネレーターを使用するかを RIA に指示するだけです。

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

次に、CSharpDomainContextGenerator から継承する必要があるクラス (MyDomainContextGenerator) を実装するように R# に指示します。もちろん、R# を使用する場合は、それが自動的に行われます。

MyCSharpClientCodeGenerator から提供できる他の 4 つの異なるコード ジェネレーターがあります。

すべてを接続するには、Silverlight プロジェクト ファイルで、ジェネレーターを使用するよう RIA に指示する必要があります。Silverlight プロジェクトを編集し、最初の PropertyGroup 内の LinkedServerProject の直後に次の要素を追加する必要があります (順序は関係ありません。参考までに述べます)。

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

Silverlight プロジェクトを再コンパイルすると出来上がりです。クラッシュする可能性があります。これをデバッグするには、Visual Studio の別のインスタンスを開き、この新しいインスタンスのジェネレーターにブレークポイントを設定し、Visual Studio の最初のインスタンスにアタッチして、Silverlight プロジェクトを再コンパイルします。

于 2012-05-17T22:01:15.320 に答える