2012-03-07 5 views
7

WCF hizmetimde bir arabirim olarak dönüş türüyle birlikte bir işlev istiyorum, ancak bir istemciden aradığımda, arabirimi uygulayan sınıf değil, bir System.Object aldım. Hizmet gönderildi.Web hizmetinde bir arabirim nasıl ortaya çıkarılır

[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; 
    } 
} 

Ben bu hizmetin uygulamasında: Burada

örnek kod

public class LinqService : IService 
{ 
    public string SayHello() 
    { 
     return "Hello"; 
    } 

    public IMyObject GetMyObject() 
    { 
     return new MyObject(); 
    } 
} 

SayHello() iyi çalışıyor, ama bir System.ObjectGetMyObject() döndürür. Bu kodu GetMyObject()IMyObject uygulayan bir nesne döndürecek şekilde nasıl değiştirebilirim?

düzenleme 1

aşağıdaki gibi kod değiştirildi:

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; 
    } 
} 

Ama hiçbir başarı!

+0

WCF yönteminizden bir arabirim döndürme amacını sorabilir miyim? – CSharpenter

+0

Aynı şekilde bir yöntemden bir yöntemle dönebilirsiniz: Uygulamayı wcf kullanıcısından gizleme. wcf kullanıcısının neden bir arayüz için uyguladığım herhangi bir sınıfı bilmesi gerekiyor? Kullanıcının, bir nesnenin hangi özellikleri veya yöntemleri karşıladığını bilmesi yeterlidir. Örneğimde, bazı parametrelere dayanarak IMyObject öğesinin farklı bir uygulamasına dönebilirim. – mans

+0

Genel olarak, Bu iyi bir niyet, ancak anlamsızdır. Arayan, herhangi bir "uygulama" görmeyecektir.Ayrıca bir "DataContract" içinde bir "OperationContract" bulunması desteklenmez. İkisi gerçekten ayrı kavramlar. Daha fazla bilgi için MSDN'de [Tasarım Hizmet Sözleşmeleri] 'ni (http://msdn.microsoft.com/en-us/library/ms733070.aspx) gözden geçirmelisiniz. –

cevap

9

Tüm WCF sözleşme argümanları ve dönüş türleri serileştirilebilir olmalıdır; arayüzler değildir. This question, KnownType özniteliğinin etrafında dönen bir yanıtla aynı sorunu araştırıyor; IMyObject'un çeşitli uygulamalarından geri dönecek olursanız, bunu tavsiye ederim, aksi halde dönüş türünü MyObject olarak değiştirmeniz gerekecektir. Serialization üzerinde

+0

Lütfen orijinal sorudaki düzenlememe bakın. – mans

+1

Saf bir tasarım bakış açısıyla, "wcf kullanıcımın bir arabirim için uyguladığım herhangi bir sınıf hakkında neden bilmesi gerektiği" sorusudur. tamamen geçerli, ancak maalesef sadece WCF'nin çalışma şeklinin bir gerçeği. –

+0

'KnownType' ve' ServiceKnownType' özniteliklerini eklemeyi deneyin ve bunları 'IMyObject' yerine 'IService''e ekleyin. –

1

Ek Notlar Aşağıdaki kurallar da Veri Sözleşme Serializer tarafından desteklenen türleri için geçerli:

Jenerik türleri tamamen veri sözleşme seri hale tarafından desteklenmektedir.

Nullable türleri, veri sözleşmesi seri hale getiricisi tarafından tam olarak desteklenir.

Arabirim türleri, Nesne olarak veya koleksiyon arabirimleri durumunda, toplama türleri olarak kabul edilir.

Sana İstemci Aktif Nesne bahsediyoruz sanırım:

.....

tam MSDN Additional Notes on Serialization


EDIT görüyoruz. Bu konuda daha fazla bilgi edinmek için aşağıdaki iletiyi inceleyin Returning an interface from a WCF service Gördüğünüz gibi sadece WCF'de serileştirme yoluyla veri gönderebilirsiniz ancak uygulama yapamazsınız. Sorununuzun başka bir yolu, instancing kullanmaktır.