मैं अपने डब्ल्यूसीएफ सेवा पर एक इंटरफ़ेस के रूप में अपने रिटर्न प्रकार के साथ एक फ़ंक्शन रखना चाहता हूं, लेकिन जब मैं इसे क्लाइंट से कॉल करता हूं तो मुझे System.Object
प्राप्त होता है, न कि इंटरफ़ेस लागू करने वाली कक्षा सेवा भेजी गई।वेब सेवा में एक इंटरफ़ेस का खुलासा कैसे करें
[ServiceContract]
public interface IService
{
[OperationContract]
string SayHello();
[OperationContract]
IMyObject GetMyObject();
}
public interface IMyObject
{
int Add(int i, int j);
}
[DataContract]
public class MyObject : IMyObject
{
public int Add(int i, int j)
{
return i + j;
}
}
इस सेवा मैं के कार्यान्वयन में:
यहां कुछ नमूना कोड है
public class LinqService : IService
{
public string SayHello()
{
return "Hello";
}
public IMyObject GetMyObject()
{
return new MyObject();
}
}
SayHello()
अच्छी तरह से काम करता है, लेकिन GetMyObject()
एक System.Object
देता है। इस कोड को कैसे बदल सकता है ताकि GetMyObject()
कोई ऑब्जेक्ट लौटाता है जो IMyObject
लागू करता है?
संपादित करें 1
पालन कोड परिवर्तित:
using System.Runtime.Serialization;
using System.ServiceModel;
[ServiceContract]
public interface IService
{
[OperationContract]
string SayHello();
[OperationContract]
IMyObject GetMyObject();
}
[ServiceKnownType(typeof(MyObject))]
public interface IMyObject
{
[OperationContract]
int Add(int i, int j);
}
[DataContract]
public class MyObject:IMyObject
{
public int Add(int i, int j)
{
return i + j;
}
}
लेकिन कोई सफलता!
मैं अपने WCF विधि से एक अंतरफलक लौटने का उद्देश्य पूछना कर सकते हैं? – CSharpenter
वही है कि आप एक विधि से एक nterface वापस कर सकते हैं: wcf के उपयोगकर्ता से कार्यान्वयन छुपा। मेरे डब्ल्यूसीएफ उपयोगकर्ता को किसी भी वर्ग के बारे में क्यों पता होना चाहिए जिसे मैंने इंटरफ़ेस के लिए लागू किया था? उपयोगकर्ता को यह जानने की जरूरत है कि किसी ऑब्जेक्ट की कौन सी संपत्तियां या विधियां आ रही हैं। मेरे उदाहरण में, मैं कुछ पैरामीटर के आधार पर IMyObject के विभिन्न प्रत्यारोपण को वापस कर सकता हूं। – mans
आम तौर पर, यह एक अच्छा इरादा है, बल्कि व्यर्थ है। कॉलर को वैसे भी "कार्यान्वयन" नहीं दिखाई देगा।'DataContract' के अंदर 'ऑपरेशन कंट्रैक्ट' रखने के लिए भी समर्थित नहीं है। दोनों वास्तव में अलग अवधारणाएं हैं। अधिक जानकारी के लिए आपको एमएसडीएन पर [डिजाइनिंग सेवा अनुबंध] (http://msdn.microsoft.com/en-us/library/ms733070.aspx) की समीक्षा करनी चाहिए। –