我正在尝试使用Generic DataContract类,这样我就不必为不同对象的集合实现几种类型。
Exp:
我有一个包含对象集合的Profile对象。
所以我希望有一个Profile<Foo>
和Profile<Foo1>
,其中profile包含Foo或Foo1对象的集合。
我一直在读WCF不支持泛型类,实际上我得到的错误如下。
Type 'GL.RequestResponse.ProfileResponse
1 [T]'无法导出为架构类型,因为它是开放的泛型类型。如果所有通用参数类型都是实际类型,则只能导出泛型类型。
现在,ProfileResponse是我尝试使用的此Profile对象。
现在我的主持人正在做以下事情。 :
ServiceConfig(typeof(ProfileHandler<EducationResponse>).Assembly,
typeof(ProfileRequest).Assembly,
typeof(Container)).Initialize();
这是使用datacontract定义处理程序。
public class ProfileHandler<T> : RequestHandler<ProfileRequest,
ProfileResponse<T>>
Container正在使用Windsor Container注册对象。
注册工作正常,但在我为WCF处理器实例化服务主机并调用主机的Open Method后,我得到了上述错误。
我真的没办法用agatha写wcf的通用响应请求吗? 如果必须为该集合中包含的每个类型定义一个Profile容器类,那就太浪费了。
感谢。
答案 0 :(得分:0)
一个人不能拥有开放的通用处理程序,因为服务器端需要知道类型是什么。 可以使用所谓的封闭泛型方法。这样服务器端就知道了加载处理程序的女巫类型。
此外,人们可能会配置Agatha,以便它允许接收与请求相关的额外信息。在这种情况下,它将是响应中包含的类型。
可以通过定义一个BaseRequest类并让所有请求扩展此类来实现。此类可以具有采用响应类型的属性。或者要包含在响应中的类型。
在此过程中,在检查请求时,进程可以获取要包装在Response中的类型,以便我知道如何加载类。
我没有实现这个,因为它需要花费太多时间,我不确定我是否应该为我们的应用程序维护Agatha负责,但这就是我要做的。