2009-05-30 14 views
10

वीएस डब्ल्यूसीएफ एकीकरण के लिए वर्तमान असेंबली में पुन: उपयोग प्रकारों का अच्छा विकल्प है "पुनर्वित्तित असेंबली में पुन: उपयोग प्रकार"। समस्या यह है कि मुझे वही चाहिए लेकिन मौजूदा असेंबली के लिए। कुछ प्रकार पहले से ही मेरी असेंबली में परिभाषित हैं और मुझे उनका पुन: उपयोग करने की आवश्यकता है।डब्ल्यूसीएफ प्रॉक्सी

प्रयोग परिदृश्य:

  1. मैं विधानसभा है, और यहाँ typeâ है।
  2. मैं इसे सेवा संदर्भ जोड़ता हूं, और विधियों में से एक तरीका प्रकार टाइप (गुण, नाम) के साथ पूरी तरह से संगत है।
  3. सेवा संदर्भ प्रॉक्सी उत्पन्न करता है, लेकिन यह नए टाइपए को फिर से बना देता है।

चरण 3 पर मुझे प्रॉक्सी की आवश्यकता है जो टाइपए लौटाएगा। नया टाइप ए नहीं।

+0

संभव डुप्लिकेट [जब एक सेवा संदर्भ जोड़ने "पुन: उपयोग मौजूदा प्रकार" नजरअंदाज कर दिया है] http://stackoverflow.com/प्रश्न/134064/पुन: उपयोग-मौजूदा-प्रकार-अनदेखा-जब-जोड़-एक-सेवा-संदर्भ) –

उत्तर

12

यदि मैं समझता हूं कि आप क्या करना चाहते हैं, तो यह एक परिदृश्य है जिसे मैं आमतौर पर चलाता हूं, और अच्छी तरह से, डब्ल्यूसीएफ के पास एक सभ्य उत्तर है: बस SvcUtil/WS सेवा संदर्भ विज़ार्ड का उपयोग न करें।

यदि आपके पास पहले से ही आपके क्लाइंट पक्ष में परिभाषित अनुबंध अनुबंध कक्षाएं हैं (ऐसा इसलिए है क्योंकि आपके पास साझा असेंबली है या क्योंकि आपके पास प्रोजेक्ट पर परिभाषित समकक्ष वर्ग हैं), तो आप बस अगले चरण पर जा सकते हैं और या तो कोड फॉर्म में पूरा सेवा अनुबंध आयात करें या इसे क्लाइंट साइड पर फिर से परिभाषित करें।

कुछ भी नहीं है कि आप svcutil और दोस्तों के उपयोग करने के लिए, बस अपने इंटरफेस को परिभाषित करने और या तो सीधे चैनल मॉडल का उपयोग बलों (यानी ChannelFactory < टी > और दोस्तों) नहीं है या, आप प्रॉक्सी वर्गों का उपयोग करना पसंद करते हैं, बस अपनी स्वयं की clientbase बनाने < टी > -व्यवस्थित वर्ग। यह वास्तव में बहुत आसान है और यह आपको लंबे समय तक परेशानी बचाएगा।

+0

हाँ, मैंने यह पूछने के बाद थोड़ा सा किया है। वैसे भी आपके समय के लिए धन्यवाद। –

5

सेवा संदर्भ जोड़ने से पहले अपने ग्राहक को साझा प्रकार असेंबली के संदर्भ को जोड़कर, क्लाइंट और सेवा के बीच प्रकार साझा करने का एक आसान तरीका है।

http://blog.walteralmeida.com/2010/08/wcf-tips-and-tricks-share-types-between-server-and-client.html

0

मैं एक ही समस्या है, जिससे मैं सेवाओं के एक जोड़े को इंगित करने के लिए एक परीक्षण दोहन चाहती थी:

आप विस्तृत परिदृश्य और नमूना परियोजना पा सकते हैं। प्रत्येक सेवा में सामान्य रूप से डेटाकंट्रैक्ट होंगे।

क्या जरूरत किया जाना:

  1. उपयोग svcutil साथ/टी: मेटाडाटा प्रत्येक यूआरएल पर।
  2. सेवा के लिए कुछ अद्वितीय के साथ सभी उत्पन्न फ़ाइलों का नाम बदलें एक ही स्थान के लिए (जैसे lala.xsd का नाम बदलें 1_lala.xsd करने के लिए)
  3. कॉपी सब उत्पन्न फ़ाइलों
  4. उपयोग svcutil साथ * .xsd .wsdl/बाहर : output.cs/नेमस्पेस:, MySpecialNamespace एक ही फ़ाइल में सभी सेवा अनुबंध और डेटाकंट्रैक्ट उत्पन्न करने के लिए।

आप चालाक होना चाहते हैं: का उपयोग निम्नलिखित टी -4 टेम्पलेट:

<#@ 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; 
} 
#> 
(के
संबंधित मुद्दे

 संबंधित मुद्दे