c# - 通用的 BehaviorExtensionElement 可能吗?

标签 c# wcf generics configuration

我有一些 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>

WcfService1.MyBehavior 存在,实现了 IServiceBehavior,并且已经过测试。

但是当我在配置文件的行为部分引用 时,我得到:

An error occurred creating the configuration section handler for system.serviceModel/behaviors: Extension element 'myBehavior2' cannot be added to this element. Verify that the extension is registered in the extension collection at system.serviceModel/extensions/behaviorExtensions. Parameter name: element

如果我创建一个非通用的 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>

关于c# - 通用的 BehaviorExtensionElement 可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4753559/

相关文章:

C#如何将 "register"类变成 "plug-ins"服务类?

c# - ListBox.SelectedIndex = -1 未取消设置所选项目

c# - SQLITE插入数据库问题Windows Phone C#

java - 基于类字段的转换函数返回类型

delphi - TObjectList<T>.IndexOf 给出不正确的结果

c# - 如何在 C# 中使用 .pdb 文件进行调试

c# - 需要 WCF 架构帮助

c# - 在 IIS 6 中托管 .net 4.0 REST WCF 服务

WCF readerQuotas 设置 - 缺点?

java - 在 Swagger 中使用泛型处理特殊情况