(WCF - C#)返回包含不同自定义类集合的自定义类

时间:2013-10-09 07:21:15

标签: c# wcf

我一直在互联网上漫游,以回答我的问题,但还没有找到答案。

以下是该方案: 我有一个WCF库服务,它对包含我的一些配置的数据库起作用。这些配置由几个自定义类组成;

[DataContract]
public class Config : Object
{
    [DataMember]
    public int AppId { get; set; }

    [DataMember]
    public int VersionId { get; set; }

    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public DateTime DateCreated { get; set; }

    [DataMember]
    private List<ParameterRow> ParameterRows = null;


[DataContract]
public class ParameterRow : Object
{
    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public int Id { get; set; }

    [DataMember]
    private List<ParameterItem> parameterItems = null;
}

[DataContract]
public class ParameterItem : Object
{
    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Value { get; set; }

    [DataMember]
    public string DataType { get; set; }
}

在那里你可以看到它是如何相关的。我还包括一个方法头,只是为了向您展示简单函数的示例。 我的当前代码与当前函数(包括DB)一起工作正常。我还有一个WCF库服务,它从数据库中检索配置并发送给客户端(当他们调用服务时)。以下是客户调用服务的函数头。

public Config GetConfig(int id);

但是,我无法弄清楚如何在一次调用中将整个配置发送到客户端,并且仍然可以使用Config-class的方法。 我知道如何使用datamembers并获取客户端的属性,但不知道集合和方法。我可以访问双方的配置类,我现在刚刚用完了想法。

建议/提示任何人?非常感谢!

编辑: 这是服务中的GetConfig方法:

public Config GetConfig(int id)
    {
        dbHandler = new DatabaseHandler(new StoredProceduresFake());
        resultConfig = dbHandler.GetLatestConfiguration(id);
        return resultConfig;
    }

这是电话的客户端(我刚刚创建了一个控制台应用来测试服务):

resultConfig = client.GetConfig(1);

但是在客户端函数中,我现在在所有config-properties上都会出错。 在客户端V-Studio要我写Config.Name = Namek_BackingField 而服务只需要编写ConfigName。 我无法访问参数列表,从而使整个配置对我无用。我的猜测是其余的数据都在Config.ExtensionData中,但我不知道如何访问它。

最终编辑;这已经解决了。如下所述,只有属性通过网络从WCF服务发送。为了解决这个问题,我创建了另一个类,它从服务中提取的类“Config”中提取数据,将其存储为需要,同时也让我有可能获得自己的方法。这是解析数据的简单解决方案。 (在某种程度上)。感谢所有的帮助,非常感谢!

3 个答案:

答案 0 :(得分:2)

订阅WCF服务时,只会通过网络发送您的属性。我解决这个问题的方法是创建一个单独的类库来包含数据契约,然后客户端和服务都可以引用这个类库,这样它们就可以共享方法的实现(通常不会与SOAP WSDL绑定)。

在客户端应用程序中创建对WCF服务的服务引用时,您可以选择重用共享类库中的类型,而不是使用WSDL构建客户端接口,以便维护方法实现。

你会很快遇到的事情是,有时只有服务器或客户端相关的函数才有用(例如:Validate( .. )函数可能只与客户有关{GetData( .. ) 1}}函数可能只是服务器上的必需函数。在这些情况下,您应该使用Extension方法或从数据协定继承来重新定义它。

答案 1 :(得分:0)

这可能会有所帮助 - 请查看OnDeserialized属性:http://msdn.microsoft.com/en-us/library/system.runtime.serialization.ondeserializedattribute.aspx

似乎你想调用方法来根据来自数据库的数据设置所有属性(即该类用于表示配置设置,但是来自数据库或类似的东西?)

相反,您的服务层应该是这样做的那个,然后在类中设置了所有设置后返回该对象。这个类本身不应该是那个做逻辑/魔术的人,而是WCF服务方法应该这样做并返回对象

答案 2 :(得分:0)

如果我理解你的问题。你的意思是,1。在一次通话中获取所有配置。
2。您可以获取Config结果对象及其属性,但无法调用生成的Config对象的方法。
如果是这样,我会在下面提出建议:

  • 创建服务合同

    public List&lt; Config&gt; GetConfig(int id); //如果id = -1,则立即返回所有配置,否则单个匹配的配置

  • 对类使用[DataContract],对属性使用[DataMember] 而不是[Serializable]

  • 而不是生成服务合同(类和接口) 使用某个工具,手动将它们复制到客户端应用程序。它 将确保已在数据合同中导入方法 类。

  • 导入所有服务器端数据库,配置文件等iff 这些是您希望能够使用的数据合同方法所必需的 要调用。