2009-05-30 39 views
10

VS WCF集成有很好的選項「在引用程序集中重用類型」。問題是,我需要相同的,但目前的大會。一些類型已經在我的程序集中定義了,我需要重用它們。在WCF代理當前程序集中重用類型

使用場景:

  1. 我有裝配,這裏有類型A。
  2. 我添加服務引用它,其中一個方法返回與TypeA(屬性,名稱)完全兼容的類型。
  3. 添加服務引用會生成代理,但會在其中重新創建新的TypeA。

在步驟3我需要代理將返回TypeA。不是新的TypeA。

+0

可能重複的[添加服務引用時,「重用現有的各類」被忽略] http://stackoverflow.com/questions/134064/reuse-existing-types-is-ignored-when-adding-a-service-reference) – 2010-08-16 01:41:00

回答

12

如果我明白你想要做什麼,那麼這是一個我經常遇到的情況,當然,WCF確實有一個像樣的答案:只是不要使用SvcUtil/WS服務引用嚮導。

如果您的客戶端中已經定義了大部分合同類(因爲您擁有共享程序集或者因爲您在項目中定義了相同的類),所以您可能只需進入下一步,要麼以代碼形式導入完整的服務合同,要麼只是在客戶端重新定義它。

沒有什麼是強迫你使用SvcUtil工具和朋友,只是定義接口和可直接使用的信道模型(即的ChannelFactory <牛逼>和朋友),或者,如果你喜歡使用代理類,剛剛創建自己的ClientBase <T>-class-class。這真的很容易,從長遠來看它可以爲您節省麻煩。

+0

是的,我這樣做了,稍微問了一下。無論如何感謝您的時間。 – 2009-05-31 20:05:06

0

我有同樣的問題,因此我想測試工具指向一對夫婦的服務。每項服務都有共同的數據合同。

什麼需要做的事情:

  1. SvcUtil工具使用與/ t:元數據對每個URL。
  2. 重命名所有生成的文件以獨特的服務的東西(如重命名lala.xsd到1_lala.xsd)
  3. 複製所有生成的文件到一個位置
  4. 使用SvcUtil工具與* .XSD 的.wsdl /出:output.cs/namespace:,MySpecialNamespace將生成所有服務契約和數據契約到單個文件。

如果你想成爲狡猾:使用下面的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; 
} 
#> 
(的
相關問題