Agatha WCF中的通用DataContract

时间:2011-04-04 19:38:23

标签: wcf castle-windsor agatha-rrsl

我正在尝试使用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容器类,那就太浪费了。

感谢。

1 个答案:

答案 0 :(得分:0)

一个人不能拥有开放的通用处理程序,因为服务器端需要知道类型是什么。 可以使用所谓的封闭泛型方法。这样服务器端就知道了加载处理程序的女巫类型。

此外,人们可能会配置Agatha,以便它允许接收与请求相关的额外信息。在这种情况下,它将是响应中包含的类型。

可以通过定义一个BaseRequest类并让所有请求扩展此类来实现。此类可以具有采用响应类型的属性。或者要包含在响应中的类型。

在此过程中,在检查请求时,进程可以获取要包装在Response中的类型,以便我知道如何加载类。

我没有实现这个,因为它需要花费太多时间,我不确定我是否应该为我们的应用程序维护Agatha负责,但这就是我要做的。