1

我只是想知道是否可以在一个接口中使用多个基类。我面临的问题是我为一个接口使用了 2 个(并且还会有更多)基类。使用第一个完全没有问题,但是当我尝试使用第二个时,它不起作用。

我简短地写下代码

[ServiceContract(Namespace = "http://bla.ServiceModel.Samples", SessionMode = SessionMode.Required)]
[ServiceKnownType(typeof(ObservableCollection<Models.Model1>))]
[ServiceKnownType(typeof(ObservableCollection<Models.MOdel2>))]
public interface IService
{
    [OperationContract]
    ObservableCollection<Models.Model1> AccessModel1();

    [OperationContract]
    ObservableCollection<Models.Model2> AccessModel2(string group);
}

与客户端连接后,创建 Model1 的集合可以正常工作。当我尝试创建 Model2 的集合时,它只是崩溃了。内部异常是“现有连接被远程主机强行关闭”。

模型 1 和模型 2 包含不同的信息,但具有相同的结构。

是否存在根本性错误或其他问题?

如果您需要任何进一步的信息,欢迎您!

更新

我将发布模型类。也许我只是瞎了眼,看不到错误。

[DataContract]
public class Model2
{
    private string status;
    private string name;
    private string telephone;

    public Model2(string sStatus, string sName, string sTelephone)
    {
        Status = sStatus;
        Name = sName;
        Telephone = sTelephone;
    }

    [DataMember(IsRequired = true, Order = 0)]
    public string Status
    {
        get { return status; }
        set { status = value; }
    }

    [DataMember(IsRequired = true, Order = 1)]
    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    [DataMember(IsRequired = true, Order = 2)]
    public string Telephone
    {
        get { return telephone; }
        set { telephone = value; }
    }
}

internal class Model2Builder: ObservableCollection<Model2>
{
    public Model2Builder(string group)
        : base()
    {
        try
        {
            DataTable dt = new Database().GetModel2Data(group);

            foreach (DataRow row in dt.Rows)
            {
                Add(new Model2(row[0].ToString(), row[1].ToString(), row[2].ToString()));
            }

            dt.Dispose();
        }

        catch (Exception ex)
        {
            //Code for log...
        }
    }
}
4

2 回答 2

2

不确定您要在这里做什么。您的模型是否实现了基类?

ServiceKnownTypeAttribute 旨在声明可以存在于对象图中但尚未存在于服务接口中的类型层次结构。

由于您已经在界面中公开了 Models1 和 Models2,因此无需使用 ServiceKnownTypeAttribute 指定它们。

例如:

[DataContract]
public class Shape { }

[DataContract]
public class Rectangle : Shape { }

[DataContract]
public class Square : Shape { }

[ServiceContract]
[ServiceKnownType(typeof(Rectangle))]
[ServiceKnownType(typeof(Square))]
public interface IService
{
    [OperationContract]
    Shape[] GetShapes();
}

public class Service : IService
{
    [OperationBehavior]
    public Shape[] GetShapes()
    {
        return new Shape[] {
            new Square(),
            new Rectangle()
        };
    }
}

请注意,您也可以使用KnownTypeAttribute

[DataContract]
[KnownType(typeof(Rectangle))]
[KnownType(typeof(Shape))]
public class Shape { }

[DataContract]
public class Rectangle : Shape { }

[DataContract]
public class Square : Shape { }
于 2013-02-19T08:51:07.003 回答
0

在您的模型类上,您是否尝试过添加无参数构造函数 - 我很确定数据协定序列化程序需要无参数构造函数,即

[DataContract]
public class Model2
{
    private string status;
    private string name;
    private string telephone;

    public Model2(){}

    public Model2(string sStatus, string sName, string sTelephone)
    {
        Status = sStatus;
        Name = sName;
        Telephone = sTelephone;
    }
    ...etc
于 2013-02-19T17:36:40.827 回答