2009-05-30 8 views
10

VS WCFインテグレーションには、「再レンダリングされたアセンブリでの再利用タイプ」という素晴らしいオプションがあります。問題は、現在のアセンブリでは同じですが、同じものが必要なことです。いくつかの型はすでにアセンブリで定義されており、再利用する必要があります。WCFプロキシの現在のアセンブリでの再利用タイプ

使用シナリオ:

  1. 私はアセンブリを持っており、ここではタイプAを持っています。
  2. サービス参照を追加し、メソッドの1つがTypeA(プロパティ、名前)と完全に互換性のある型を返します。
  3. サービス参照を追加すると、プロキシが生成されますが、その中に新しいTypeAが再作成されます。

手順3では、TypeAを返すプロキシが必要です。新しいタイプAではありません。

+0

可能複製(http://stackoverflow.com [サービス参照を追加するとき、「再利用、既存のタイプは」無視されます]/question/134064/reuse-existing-types-is-ignored-service-referenceを追加するとき) –

答えて

12

あなたが何をしたいのか分かっていれば、それは私がよく遭遇するシナリオです.WCFにはまともな答えがあります。SvcUtil/WSサービス参照ウィザードは使用しないでください。

ほとんどの契約クラスが既にクライアント側で定義されている場合(共有アセンブリがあるため、またはプロジェクトで同等のクラスが定義されているため)、次の手順に進むこともできます。完全なサービス契約をコード形式でインポートするか、単純にクライアント側で再定義します。

svcutilとフレンドを使用する必要はありません。インターフェイスを定義して直接チャネルモデル(ChannelFactory <T>とお友達)を使用するか、プロキシクラスを使用する場合は独自のClientBase <T>由来のクラス。それは本当に簡単ですし、長期的には問題を解決します。

+0

ちょっと、私はこのやり方で、少し質問した後です。とにかくお時間をありがとう。 –

0

私はサービスのカップルを指すようにテストハーネスを望んでいたことにより、同じ問題を、持っていた:

あなたがそこに詳細なシナリオとサンプルプロジェクトを見つけることができます。各サービスには、データの共通点が共通しています。

  1. 使用svcutilと/ T:各URLのメタデータ何をすべきか

    。 .wsdl /アウトを.XSD *と

  2. は、単一の場所に
  3. コピー生成されたすべてのファイルを(例えば1_lala.xsdするlala.xsdの名前を変更します)サービスのためのユニークな何かを
  4. 使用svcutilを生成されたすべてのファイルの名前を変更します:output.cs/namespace:、MySpecialNamespaceを使用すると、すべてのサービス契約とデータを1つのファイルに生成できます。

あなたが狡猾になりたい場合は、次のT4テンプレートを使用:の

<#@ template language="C#v4.0" hostspecific="True"#> 
<#@ import namespace="System.Diagnostics" #> 
<#@ import namespace="System.IO" #> 
<#=GetGeneratedCode(
"http://localhost/Service/Service1.svc", 
"http://localhost/Service/Service2.svc", 
"http://localhost/Service/Service3.svc", 
"http://localhost/Service/Service4.svc" 
)#> 
<#+ 
const string _svcutil = @"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\svcutil.exe"; 

private string GetGeneratedCode(params string[] urls) 
{ 
    var tmp = GetTemporaryDirectory(); 
    foreach (var url in urls) 
    { 
     GetMetadata(url, tmp); 
    } 

    RunSvcutil(tmp, "*.wsdl *.xsd /out:output.cs /namespace:*," +  Path.GetFileNameWithoutExtension(Host.TemplateFile)); 
    var result = File.ReadAllText(Path.Combine(tmp, "output.cs")); 
    return result; 
} 

private static void RunSvcutil(string workingFolder, string arguments) 
{ 
    var processInfo = new ProcessStartInfo(_svcutil); 
    processInfo.Arguments = arguments; 
    processInfo.WorkingDirectory = workingFolder; 

    var p = Process.Start(processInfo); 
    p.WaitForExit(); 
} 

private static void GetMetadata(string url, string destination) 
{ 
    var workingFolder = GetTemporaryDirectory(); 
    RunSvcutil(workingFolder, string.Format("/t:metadata \"{0}\"", url)); 

    foreach (var filename in Directory.GetFiles(workingFolder)) 
    { 
     File.Copy(filename, Path.Combine(destination,  Path.GetFileNameWithoutExtension(url) + "_" + Path.GetFileName(filename))); 
    } 
} 

private static string GetTemporaryDirectory() 
{ 
    string tempDirectory = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); 
    Directory.CreateDirectory(tempDirectory); 
    return tempDirectory; 
} 
#> 
関連する問題