如何创建对基本服务方法的引用?

时间:2016-09-23 06:08:31

标签: c# wcf inheritance

我有这样的服务类层次结构:

基础服务:

[ServiceContract()]
public interface IServiceBase
{
    [OperationContract]
    void BaseMethod();
}

public class ServiceBase : IServiceBase
{
    public void BaseMethod()
    {}
}

服务A:

[ServiceContract()]
public interface IServiceA : IServiceBase
{}

public class ServiceA : ServiceBase, IServiceA
{}

服务B:

[ServiceContract()]
public interface IServiceB : IServiceBase
{}

public class ServiceB : ServiceBase, IServiceB
{}

在客户端,我通过Visual Studio"添加服务引用"为ServiceA和ServiceB创建了两个代理类。工具:

ProxyA proxyServiceA;
ProxyB proxyServiceB;

这些是关于两种不同服务的引用(尽管在服务器端有一个基类)。

我想以相同的方式通过这些代理调用BaseService中的方法。例如,我想将这些代理作为参数传递给方法并调用其BaseService方法,如下所示:

// somewhere on the client side
WorkMethod(proxyServiceA);
WorkMethod(proxyServiceB);

// Something like this, BUT I DON'T REALLY KNOW WHAT TYPE OF PARAMETER TO USE
void WorkMethod(ProxyBase proxyBase)
{
    proxyBase.BaseMethod();
}

但是怎么做,要使用什么类型的参数(请记住,这些代理是没有BaseService共同祖先的不同类)?

换句话说,在服务器端,已知ServiceA和ServiceB具有共同的祖先,并且可以调用基本方法,但如何在客户端进行此操作?

是否有可能在客户端上获得一些被认为是这两个代理的基类的类?(当然除了System.ServiceModel.ClientBase)

1 个答案:

答案 0 :(得分:0)

您需要使用 ServiceKnownTypeAttribute 类。 KnownType属性允许您为数据协定(您的基本服务)指定可接受的子类。此示例显示了它的使用方法。没有KnowType,你总会得到像

这样的异常
  

CommunicationException未处理

[DataContract] 
[KnownType( typeof( Student ) )]
[KnownType( typeof(Teacher) )]
public abstract class BaseService
    {
        [DataMember]
        public int Code { get; set; }

        [DataMember]
        public string Name { get; set; }
    }
[DataContract]  
public class Student : BaseService
    {
        [DataMember]
        public int StudentId { get; set; }
    }
[DataContract]
public class Teacher : BaseService
    {
        [DataMember]
        public int TeacherId { get; set; }
    } 

Here is MSDN doc