2015-06-23 7 views
13

कैसे एक व्यक्ति एक WCF परियोजना का उपयोग किए बिना WCF के माध्यम से कई वर्गों के शामिल API पद्धति प्रति विधि उजागर के बारे में जाना होगा से स्वचालित रूप से सर्वर साइड WCF सेवा उत्पन्न करें।मौजूदा एपीआई

उदाहरण के लिए, मैं समझता हूँ कि मैं हमेशा की तरह एक WCF सेवा पुस्तकालय बना सकते हैं और सिर्फ एक WCF सेवा "RainfallMonitor" कहा जाता जोड़ने चलो कहते हैं कि मैं निम्नलिखित

public interface RainfallMonitor 
{ 
    [ExposeToWeb] 
    void RecordRainfall(string county, float rainfallInches); 

    [ExposeToWeb] 
    float GetTotalRainfall(string county); 

    void ClearRainfall(string county); 
} 

करते हैं।

क्या मैं तलाश कर रहा हूँ है ... यह संभव/उचित किसी भी तरह वास्तव में कक्षाएं WCF सेवाओं बनाने के बिना एक पूरे एपीआई के लिए संकलन समय पर WCF संबंधित कोड के सभी उत्पन्न करने के लिए है। संभावित रूप से ExposeToWeb जैसे गुणों का उपयोग करने के लिए सेवाओं के माध्यम से कौन सी विधियों का खुलासा करना है। उसके एवज में इस तरह कार्य करेगा:

  1. बनाएं/RainfallAPI
  2. संकलित बुलाया परियोजना में कक्षाओं को संशोधित करने और एक अन्य परियोजना/dll स्वचालित रूप से RainfallService बुलाया जेनरेट किया है।

मूलतः:

  • यदि यह संभव क्या दृष्टिकोण मैं वास्तव में इसे लागू करने का समय लग सकता है?
  • क्या गंभीर नुकसान मैं करना पड़ सकता है?
  • वहाँ किसी भी मौजूदा codebase कि कुछ इसी तरह मैं प्रेरणा

के लिए इस पर गौर कर सकता है स्पष्टीकरण के लिए करता है: मैं के बारे में स्वचालित रूप जेनरेट ग्राहक ठूंठ, मैं सर्वर साइड पर सेवाओं बनाने के बारे में पूछ रहा हूँ नहीं कह रहा हूँ।

+2

मैं अपने सिर के शीर्ष से दो संभावित समस्याओं के बारे में सोच सकता हूं: 1) विधि अधिभार को एकाधिक ऑपरेशन कॉन्ट्रैक्ट्स के लिए 1: 1 मैप नहीं किया जा सकता है (नाम अलग होना चाहिए)। 2) एपीआई में उपयोग किए जाने वाले सभी जटिल प्रकारों को क्रमिक (उदाहरण के लिए [डेटाकंट्रैक्ट्स]) होना चाहिए, इसलिए एपीआई लेखकों को पता होना चाहिए कि उनके एपीआई को डब्ल्यूसीएफ सेवाओं के रूप में उजागर किया जाएगा। – nodots

उत्तर

0

"मैं जो खोज रहा हूं उसके बारे में आपके प्रश्न के लिए ... क्या किसी भी तरह से डब्लूसीएफ सेवाओं को वास्तव में कक्षाओं के बिना पूरी एपीआई के संकलन समय पर सभी डब्ल्यूसीएफ संबंधित कोड उत्पन्न करना संभव/उचित है।" विकल्प हैं, लेकिन वे सभी बहुत काम करेंगे।

आप है कि इस तरह के रूप में CSharpCodeProvider कक्षाओं का इस्तेमाल करता है एक कोड पीढ़ी आवेदन/पुस्तकालय लिखने के लिए की आवश्यकता होगी और प्रतिबिंब एक पोस्ट का निर्माण कदम के रूप में अपने पुस्तकालय का निरीक्षण करने, कोड है कि आप स्मृति में चाहते हैं का निर्माण (वहाँ वीबी के लिए एक के रूप में अच्छी तरह से है) , और एक डीएलएल के रूप में इसे बचाओ।

यह एप्लिकेशन कस्टम आपके द्वारा बनाए गए विशेषता है कि इंगित करता है कि यह एक WCF सेवा, और आउटपुट WCF कोड नियम आपके द्वारा निर्धारित पर आधारित होना चाहिए खोजने की आवश्यकता होगी।

प्रभाव में आप CodeDOM मॉडल है, जो एक बहुत अलग तरीके से कोड के बारे में सोच की आवश्यकता है का उपयोग कर कोड लिखने की जरूरत है। हर कोई अपनी सोच को उस स्तर पर अमूर्त करने में सक्षम नहीं है।

ध्यान रखें कि CodeDOM मॉडल का उपयोग, आप मुद्दों है कि डेटा अनुबंधों के लिए serializable की आवश्यकता होती है के रूप में ऐसी उल्लेख nodots से कुछ दूर कर सकते हैं। इसे जोड़ा जा सकता है और आपके कोडडॉम आधारित प्रतिबिंब पुस्तकालय द्वारा एक नया डीएलएल आउटपुट किया जा सकता है।

विचारशील डिजाइन और काफी काम के माध्यम से, आप जिस आउटपुट की तलाश कर रहे हैं उसे हासिल करना संभव है। यह सिर्फ एक अंधेरा सड़क है जहां कई परेशानियां हैं।

1

मैंने हाल ही में इस पुस्तकालय का प्रमुख: Fody।जैसा कि मैं समझता हूं, यह निर्माण प्रक्रिया में हुक करना और आईएल को असेंबली में इंजेक्ट करना संभव बनाता है। मुझे पूरा यकीन नहीं है कि यह कैसे काम करता है, लेकिन आईएल हालांकि खोजना संभव हो सकता है, ExposeToWeb विशेषता के साथ सभी विधियों को ढूंढें और असेंबली में डब्ल्यूसीएफ सेवा के लिए अनुबंध को उत्सर्जित करने के लिए इसका उपयोग करें।

लेकिन दूसरी ओर, यदि आप कक्षा में विशेषताओं को जोड़ रहे हैं, तो क्यों शुरू करने के लिए सही WFC विशेषताओं को न जोड़ें, और फिर SvcUtil का उपयोग पोस्ट बिल्ड में अनुबंध उत्पन्न करने के लिए करें?

संपादित करें: यहाँ आप कैसे इस्तेमाल कर सकते हैं का एक उदाहरण है svcutil:

सी #:

[ServiceContract] 
public interface IRainfallMonitor 
{ 
    [OperationContract] 
    void RecordRainfall(string county, float rainfallInches); 
} 

public class RainfallMonitor : IRainfallMonitor 
{ 
    public void RecordRainfall(string county, float rainfallInches) 
    { 
     // code 
    } 
} 

पोस्ट का निर्माण PowerShell:

$svcutil = "C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\SvcUtil.exe" 
$csc = "C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe" 
$assembly = "bin/debug/ProjectWithoutWCF.dll" 
$service = "ProjectWithoutWCF.RainfallMonitor" 
$outputns = "ProjectWithoutWCF.RainfallMonitor.Service" 
$outputdir = "bin/debug" 

md svcutil_tmp 
cd svcutil_tmp 

& $svcutil /serviceName:"$service" "../$assembly" 
& $svcutil *.wsdl *.xsd /importxmltypes /out:"output.cs" /n:"*,$outputns" 
& $csc /target:library /out:$outputns.dll "output.cs" 

cp "$outputns.dll" "../$outputdir" 
cp output.config "../$outputdir/$outputns.dll.config" 
cd .. 
rm -r .\svcutil_tmp 

और आप में कुछ इस तरह की आवश्यकता होगी आप प्रोजेक्ट कॉन्फ़िगर करते हैं:

<system.serviceModel> 
    <services> 
    <service name="ProjectWithoutWCF.RainfallMonitor" > 
     <endpoint address="" binding="basicHttpBinding" contract="ProjectWithoutWCF.IRainfallMonitor"> 
     </endpoint> 
    </service> 
    </services> 
</system.serviceModel> 

यह थोड़ा सा विचित्र रूप से है और आपको स्क्रिप्ट और कॉन्फ़िगरेशन में कुछ tweaking की आवश्यकता होगी। लेकिन परिणाम यह है कि आपके पास डब्ल्यूसीएफ सेवा अनुबंध के साथ ProjectWithoutWCF.RainfallMonitor.Service.dll फ़ाइल है।

0

हां, यह सही उपकरण का उपयोग करके मध्यम प्रयास के साथ किया जा सकता है। यदि आपके पास विजुअल स्टूडियो है, तो आपके पास पहले से ही माइक्रोसॉफ्ट के टी 4 कोड जनरेटर हैं। यह आपको "टेक्स्ट टेम्पलेट्स" लिखकर कोड उत्पन्न करने की अनुमति देता है, जो एएसपी.नेट के रेजर सिंटैक्स की बहुत याद दिलाता है। टी 4 का उपयोग करके, आप वास्तव में अपने मौजूदा वर्गों को तुरंत चालू कर सकते हैं और सभी वर्ग नामों और विधि हस्ताक्षर पढ़ने के लिए प्रतिबिंब का उपयोग कर सकते हैं, और आखिरकार अपनी डब्ल्यूसीएफ सेवाओं को उत्पन्न कर सकते हैं। यह इतना मुश्किल नही है!

यहाँ Oleg Sych's tutorial से एक नमूना टी -4 टेम्पलेट है:

<#@ template language=“C#v3.5” #> 
<#@ output extension=“SQL” #> 
<#@ assembly name=“Microsoft.SqlServer.ConnectionInfo” #> 
<#@ assembly name=“Microsoft.SqlServer.Smo” #> 
<#@ import namespace=“Microsoft.SqlServer.Management.Smo” #> 
<# 
    Server server = new Server(); 
    Database database = new Database(server, “Northwind”); 
    Table table = new Table(database, “Products”); 
    table.Refresh(); 
#> 
create procedure <#= table.Name #>_Delete 
<# 
    PushIndent(”\t”); 
    foreach (Column column in table.Columns) 
    { 
     if (column.InPrimaryKey) 
      WriteLine(”@” + column.Name + ” ” + column.DataType.Name); 
    } 
    PopIndent(); 
#> 
as 
    delete from <#= table.Name #> 
    where 
<# 
    PushIndent(”\t\t”); 
    foreach (Column column in table.Columns) 
    { 
     if (column.InPrimaryKey) 
      WriteLine(column.Name + ” = @” + column.Name); 
    } 
    PopIndent(); 
#> 

उत्पादन इस प्रकार दिखाई देगा:

create procedure Products_Delete 
    @ProductID int 
as 
    delete from Products 
    where ProductID = @ProductID 
बेशक

, अपने उदाहरण, आप के बजाय अपने मौजूदा वर्ग पुस्तकालय पर प्रतिबिंब का उपयोग करेंगे एसक्यूएल प्रश्नों के। आपके द्वारा जेनरेट की जाने वाली डब्ल्यूसीएफ सेवाएं केवल आपकी मौजूदा लाइब्रेरी को कॉल कर सकती हैं, ताकि आपको सभी वास्तविक डोमेन तर्कों की प्रतिलिपि बनाने की आवश्यकता न हो।

MSDN

https://msdn.microsoft.com/en-us/library/bb126445.aspx

0

आप रोसलिन उपयोग कर सकते हैं, रोसलिन सेवा, जहां में आप सी # फ़ाइल को पार्स और स्रोत कोड उत्पन्न कर सकते हैं के रूप में आप की जरूरत के रूप में नए संकलक है।

आप यहाँ कुछ उदाहरण देख सकते,

http://www.codeproject.com/Articles/302595/Roslyn-CTP-Three-Introductory-Projects

ऐसा नहीं है कि मुश्किल नहीं होना चाहिए।

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