VS WCF集成有很好的選項「在引用程序集中重用類型」。問題是,我需要相同的,但目前的大會。一些類型已經在我的程序集中定義了,我需要重用它們。在WCF代理當前程序集中重用類型
使用場景:
- 我有裝配,這裏有類型A。
- 我添加服務引用它,其中一個方法返回與TypeA(屬性,名稱)完全兼容的類型。
- 添加服務引用會生成代理,但會在其中重新創建新的TypeA。
在步驟3我需要代理將返回TypeA。不是新的TypeA。
VS WCF集成有很好的選項「在引用程序集中重用類型」。問題是,我需要相同的,但目前的大會。一些類型已經在我的程序集中定義了,我需要重用它們。在WCF代理當前程序集中重用類型
使用場景:
在步驟3我需要代理將返回TypeA。不是新的TypeA。
如果我明白你想要做什麼,那麼這是一個我經常遇到的情況,當然,WCF確實有一個像樣的答案:只是不要使用SvcUtil/WS服務引用嚮導。
如果您的客戶端中已經定義了大部分合同類(因爲您擁有共享程序集或者因爲您在項目中定義了相同的類),所以您可能只需進入下一步,要麼以代碼形式導入完整的服務合同,要麼只是在客戶端重新定義它。
沒有什麼是強迫你使用SvcUtil工具和朋友,只是定義接口和可直接使用的信道模型(即的ChannelFactory <牛逼>和朋友),或者,如果你喜歡使用代理類,剛剛創建自己的ClientBase <T>-class-class。這真的很容易,從長遠來看它可以爲您節省麻煩。
是的,我這樣做了,稍微問了一下。無論如何感謝您的時間。 – 2009-05-31 20:05:06
在添加服務引用之前,只需在客戶端添加對共享類型程序集的引用,就可以輕鬆地在客戶端和服務之間共享類型。
你可以找到有詳細的方案和示例項目:
http://blog.walteralmeida.com/2010/08/wcf-tips-and-tricks-share-types-between-server-and-client.html
我有同樣的問題,因此我想測試工具指向一對夫婦的服務。每項服務都有共同的數據合同。
什麼需要做的事情:
如果你想成爲狡猾:使用下面的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;
}
#>
(的
可能重複的[添加服務引用時,「重用現有的各類」被忽略] http://stackoverflow.com/questions/134064/reuse-existing-types-is-ignored-when-adding-a-service-reference) – 2010-08-16 01:41:00