我将直接通过代码解释:
AddObjectToDatabase()
{
Publish(theMessage);
}
theMessage是“Message”类的对象。
AddObjectToDatabase是一种服务方法。
“发布”方法使用Message作为参数调用IPublishing接口的“CallBackMethod”。实际上,它遍历List<IPublishing>
静态对象(包含所有发布者),并为每个对象调用CallBackMethod方法。
在调用该服务的项目中,我这样做:
Class TestClass : IPublishing
{
...
TestMethod()
{
...
ISubscription subsriberProxy = ProxyCreator.createProxy(this);
subsriberProxy.Subscribe("client1");
theService.AddObjectToDatabase();
}
CallBackMethod(Message m)
{
}
}
TestClass类必须实现一个名为“CallBackMethod”的方法,并接收一个Message对象作为参数。
我的问题是服务是由“服务引用”添加的,而且TestClass不知道Message类,因为它不是直接在服务中使用,而是在服务的方法中使用。
当我只使用Message作为参数向服务添加新方法时,服务就知道该对象并且它完美地工作。 我无法改变代码的体系结构,因为我没有编写这部分代码。
有没有办法“知道”服务使用的所有对象,即使是那些没有直接使用的对象?
编辑1:
回调是通过netTcpBinding实现的。
我无法发布一个部分,因为所有配置都是按代码进行的。
我尝试在另一个DataContract(已知)中添加[KnownType(typeof(Message))]
,现在我可以在visual studio中看到它。
我还尝试用(Object)而不是(Message)更改回调方法,并尝试了这个解决方案:http://msdn.microsoft.com/en-us/library/system.servicemodel.serviceknowntypeattribute.aspx
现在“唯一”问题是InvalidCastException。实际上,他无法从TheServiceClass.Message转换为TheClassLibrary.Message
ServiceClass是与服务引用(生成)一起使用的类,TheClassLibrary是定义Message类的类。