WCF和对象

时间:2009-03-12 17:43:33

标签: wcf web-services casting

我正在尝试将对象传递给WCF Web服务,我传入的对象是Server对象,然后我希望能够调用TestConnection();

我遇到的问题是Server是基类,并且有几个派生类的服务器,即我想使用的SqlServer2005Server,OracleServer和ODBCServer

我希望能够传入服务器对象,然后确定其类型,强制转换然后使用方法

public string TestServerConnection(Server server)
{
    if (server.ConnectionType == "SqlServer")
    {
        SqlServer2005Server x = (SqlServer2005Server)server;
        // Tests connection to server and returns result
        return x.TestConnection();
    }

    return "";
}

'Server'基类实现了IServer

我无法施展,你能建议吗?

备受赞赏

菲尔

3 个答案:

答案 0 :(得分:2)

作为Daniel Pratt said,最后,你只是穿越了XML(并非总是如此,但大部分时间都是这样)。

如果您使用代理生成器生成服务器类型的定义,那么您将无法对Server的方法进行调用,因为在代理定义中仅使用属性(至少在语义上) 。此外,您无法转换为派生类型,因为您的实例实际上是一个单独的类型定义,而不是实际的基础。

如果Server类型确实是同一类型(并且相同,我指的是对同一程序集的引用,而不仅仅是名称和模式),那么您可以执行Steve said并使用KnownType属性在服务器定义上,为每个派生类添加一个属性。

但是,就像他说的那样,这会使你的代码卷入其中,所以在这样做时要小心。

我认为使用控制反转可以在这里工作,但是你会遇到与特定提供者的泛型引用相同的情况。

答案 1 :(得分:1)

您需要为每个派生类的服务合同添加KnownType声明。有一些方法可以实现自动化(因为它显然会使代码卷积并破坏继承),但它们需要大量的工作。

答案 2 :(得分:1)

您传递的对象是否代表与DBMS的“实时”连接?如果答案是肯定的,那就没有希望这样做了。请记住,尽管有漂亮的包装器,但是你的Web服务从调用者那里得到的唯一东西是xml。