C# 返回不同类型的SOAP Web服务方法

C# 返回不同类型的SOAP Web服务方法,c#,web-services,soap,C#,Web Services,Soap,我们的Web服务必须返回不同的类型,这些类型可能具有一个具有某些共享属性的基类型,但在其他方面具有不同的属性 方法可能如下所示: CreateObject(int类型ID) 根据typeID,将返回不同类型的对象。如果这不是Web服务,那么IOC容器就可以做到这一点。但是在我们的场景中,对象必须由服务创建,并且实际上将被另一个服务使用,然后将对象传递给业务层 我们试图避免大量的映射,如果可能的话,对象类型应该只在一个地方定义 在这种情况下,什么样的设计模式才是好的呢?类似这样的设计模式就起到了作

我们的Web服务必须返回不同的类型,这些类型可能具有一个具有某些共享属性的基类型,但在其他方面具有不同的属性

方法可能如下所示: CreateObject(int类型ID)

根据typeID,将返回不同类型的对象。如果这不是Web服务,那么IOC容器就可以做到这一点。但是在我们的场景中,对象必须由服务创建,并且实际上将被另一个服务使用,然后将对象传递给业务层

我们试图避免大量的映射,如果可能的话,对象类型应该只在一个地方定义


在这种情况下,什么样的设计模式才是好的呢?

类似这样的设计模式就起到了作用(当然这可以通过IOC等进行识别),我缺少的是“KnownType”属性:

[ServiceContract]
public interface IService1
{
    [OperationContract]
    AbstractResult GetAbstractData(int id);
}

[DataContract]
[KnownType(typeof(ConcreteResult1))]
[KnownType(typeof(ConcreteResult2))]
public abstract class AbstractResult
{
    [DataMember]
    public int ID { get; set; }
}

[DataContract]
public class ConcreteResult1 : AbstractResult
{
    [DataMember]
    public string Name { get; set; }
}

[DataContract]
public class ConcreteResult2 : AbstractResult
{
    [DataMember]
    public int Number { get; set; }
}
服务方法的简单示例:

public class Service1 : IService1
{

    public AbstractResult GetAbstractData(int id)
    {
        if (id == 1)
            return new ConcreteResult1() { ID = 1,  Name = "red" };
        else
            return new ConcreteResult2() { ID = 2,  Number = 123 };
    }
}