5

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

这是场景:我有一个 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; }
}

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

public Config GetConfig(int id);

但是,我无法弄清楚如何在一次调用中为客户端获取整个配置,并且仍然能够使用 Config 类的方法。我知道如何使用数据成员并向客户端获取属性,但不知道如何使用集合或方法。我可以访问双方的配置类,目前我的想法已经用完了。

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

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

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

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

resultConfig = client.GetConfig(1);

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

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

4

3 回答 3

2

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

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

您很快就会遇到的事情是,拥有只与服务器或客户端相关的函数有时会很有帮助(即:一个Validate( .. )函数可能只与客户端相关,而一个GetData( .. )函数可能只在服务器上是必需的。在在这些情况下,您应该使用扩展方法或从数据协定继承来重新定义它。

于 2013-10-09T08:54:51.653 回答
0

如果我理解了你的问题。您
的意思是,1. 一次调用所有配置。
2. 您可以获取配置结果对象及其属性,但您无法调用结果配置对象的方法。
如果是这样,那么我会建议以下几点:

  • 创建服务合同为

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

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

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

  • 导入所有服务器端数据库、配置文件等。如果您希望能够调用的数据合约方法中需要这些。

于 2013-10-09T09:14:23.853 回答
0

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

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

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

于 2013-10-09T08:29:48.740 回答