我有一个非常庞大且成熟的 C++ 代码库,我正在尝试使用 SWIG 为其生成 C# 接口。我无法更改实际的 C++ 代码本身,但我们可以使用 SWIG 提供的任何内容来扩展/更新它。我面临一个问题,如下所示编写的 C++ 函数会导致 C# 出现问题。
A* SomeClass::next(A*)
Run Code Online (Sandbox Code Playgroud)
调用者可能会执行以下操作:
A* acurr = 0;
while( (acurr = sc->next(acurr)) != 0 ){
if( acurr isoftype B ){
B* b = (B*)a;
...do some stuff with b..
}
elseif( acurr isoftype C )
...
}
Run Code Online (Sandbox Code Playgroud)
本质上,迭代元素容器,根据元素的真实类型,执行不同的操作。遗憾的是,SWIG 为“next”函数生成的 C# 层执行了以下操作:
return new A();
Run Code Online (Sandbox Code Playgroud)
因此,C# 中的调用代码无法确定返回的对象是否实际上是派生类,它实际上似乎始终是基类(这确实有道理)。我遇到过几种解决方案:
公共静态对象castTo(对象fromObj,类型toType) { 对象 retval = …
我打算为内网使用创建一个相当简单的Web服务.该服务最终将成为数据库的接口,这将使我能够跟踪公司内部的各种内部工具正在做什么.我想我想要一个Web服务,以便组织内的各种工具(以及不同的语言)可以轻松更新数据库,而无需了解架构.
我已经阅读了许多与搜索https://stackoverflow.com/search?q=soap+rest相关的REST和SOAP问题,但我不确定我是否找到了答案.
我的困境似乎是我希望REST的简单性,同时还具有WSDL的代码生成功能,这似乎意味着SOAP.对我来说,最重要的是各种内部工具(JAVA,Perl,Python,PHP,C++)能够与此服务进行通信,并且当手动重写/维护每种语言的界面层时,这似乎很愚蠢. WSDL路由会为我做这件事.据我所知,如果WS需要更改,您将更新WSDL,重新生成客户端存根,并对使用存根的代码进行必要的更改(无论如何都需要这样做).
例如 - 假设我有一个用JAVA编写的工具,它使用RESTful Web服务.我想这个工具将有特定的代码来处理某些URL,启动请求,对响应执行某些操作,如果我愿意,可以将其转换为某些数据结构等.现在让我说我也有一个Perl工具在做一样.现在我需要Perl代码来做同样的事情,对特定URL做出请求获取响应,对它们做一些事情等等.在每种情况下,因此在C++和Python和C#中,代码无法共享,最终我'最终会得到一个包装类/方法,可以隐藏我的许多丑陋.我更倾向于在一个类上调用一个函数,该类返回封装在一个对象中的数据,而不必担心URL,参数,响应等等.当然,也许它在任何特定的地方都没有很多代码但是随着时间的推移,它开始累积起来.将其与每个工具相乘,现在当我对服务进行更改时,我必须更新每个CRUD操作中的URL以及随之而来的所有内容.我想我想象一下,WSDL是为你完成的方面.您的代码只是与存根交互.什么存根做什么,谁在乎?Urls,arguments,response - 如果有任何更改,只需从WSDL重新生成存根.如果该过程导致您的代码中断,那么就是这样,但至少我不必更新所有处理请求和处理响应细节的代码.这真的不是问题吗?也许我需要做的只是创建一个服务和一些客户,看看我真正反对的是什么.
虽然我是一名经验丰富的JAVA,Perl,Python,C++等经验丰富的程序员,但这是我第一次考虑创作WS而没有其他WS的经验,所以我正在寻找一些指导.我是否只使用WSDL/SOAP并忘记每个人都在谈论流行,简单和有用的REST是什么?