我只想注册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>

07-24 22:19