我只想注册wcf服务的一些服务行为;没有配置。我想每次都可以通过使用泛型跳过创建behaviorextensionelement子体:
public class SimpleBehaviorExtensionElement<TBehavior> : BehaviorExtensionElement
where TBehavior: new()
{
protected override object CreateBehavior()
{
return new TBehavior();
}
public override Type BehaviorType
{
get { return typeof(TBehavior); }
}
}
在web.config中:
<behaviorExtensions>
<add name="myBehavior2"
type="WcfService1.SimpleBehaviorExtensionElement`1[[WcfService1.MyBehavior,
WcfService1]], WcfService1"/>
</behaviorExtensions>
WCFService 1.My行为存在,实现IServiceBehavior,并已被测试。
但是当我在配置文件的behavior部分引用时,我得到:
创建
的配置节处理程序
system.servicemodel/行为:
扩展元素“myBehavior2”不能
添加到此元素中。确认
分机注册在
扩展集合位于
system.servicemodel/extensions/behaviorextensions。
参数名称:元素
如果我创建了一个非泛型的behaviorextensionelement子体,一切都会正常工作,我可以这样做。但现在它困扰着我。;)
最佳答案
不幸的是,这是不可能的配置文件,至少在一个可靠的方式。
原因是,如果您有一个泛型类class A<T>
和一个类参数class B
,框架将不会创建一个类A<B>
,除非您使用它声明一个类型A<B>
。格式为a`1[[b,assm]]的名称只是在运行时创建的名称—它表示通用的“a”,它接受使用以下类型创建的1个参数。这不是一个提示,一个类型工厂-这是你需要什么,你正在做的。所以如果你幸运的话,你也许可以让这个工作,而且A<B>
碰巧被声明了,但是我不会依赖它。
我相信,这是在数据契约序列化中修复的,该序列化被框架的后面部分使用,但是配置是旧的。如果查看xaml,则可以将类型参数与类型一起使用:
<scg3:Dictionary x:TypeArguments="x:String, x:Object">
注意,这是一条到类型工厂的显式指令,配置分析器没有这条指令。
遗憾的是,这会给您留下为每个扩展声明一个具体类型的开销,但这不是很多工作:
public class MyBehaviorExtensionElement :
SimpleBehaviorExtensionElement<MyBehavior> {}
从好的方面来说,它使您的配置文件更可读。
<behaviorExtensions>
<add name="myBehavior"
type="BehaviorTest.MyBehaviorExtensionElement, ServiceLibrary"/>
</behaviorExtensions>