【问题标题】:unity configuration open generic typesunity 配置开放泛型类型
【发布时间】:2010-09-21 11:21:12
【问题描述】:

我正在尝试使用统一来解析IChannelFactory<ISomeType> 的通用实例,以创建通向我编写的服务的通道。

问题是这个类ChannelFactory<ISomeType>的具体版本将具体类型System.ServiceModel.Channels.Binding作为参数。

我的第一个问题是找不到System.ServiceModel,但我通过输入超级完全限定名称(包括版本号等)解决了这个问题。所以现在我可以闯入代码但是当我尝试解决IChannelFactory时它会爆炸

我的配置是这样的:

      <!--binding-->
      <type name="customerBinding" type="System.ServiceModel.BasicHttpBinding, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
        <typeConfig extensionType="Microsoft.Practices.Unity.Configuration.TypeInjectionElement, Microsoft.Practices.Unity.Configuration">
          <constructor>
            <param name="configurationName" parameterType="System.String">
              <value value="CustomerAccountService" />
            </param>                
          </constructor>
        </typeConfig>
      </type>

      <!-- customer account channel factory -->
      <type name="customerChannelFactory" 
            type="System.ServiceModel.Channels.IChannelFactory`1[[ServiceContracts.Customer.ICustomerAccountProvider, ServiceContracts.Customer]], System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL" 
            mapTo="System.ServiceModel.ChannelFactory`1[[ServiceContracts.Customer.ICustomerAccountProvider, ServiceContracts.Customer]], System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
        <typeConfig extensionType="Microsoft.Practices.Unity.Configuration.TypeInjectionElement, Microsoft.Practices.Unity.Configuration">
          <constructor>
            <param name="binding" parameterType="System.ServiceModel.Channels.Binding, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
              <dependency name="customerBinding" />
            </param>
          </constructor>
        </typeConfig>
      </type>          

我得到的错误是它无法构造类型,因为它是一个接口,即使到具体类型的映射显然存在。请注意,我试图将类型解析限制为特定类型,因此它仅适用于 IChannelFactory&lt;ISomeType&gt; 而不是 IChannelFactory&lt;ISomeOtherType&gt;,例如。也许这不是正确的做事方式?

如果我只是尝试单独解决Binding,它表示它无法与其他采用一个参数的构造函数消除歧义(即使我将参数类型定义为字符串!)

任何想法或指示我在这里做错了什么?或者甚至是一个解决方案;-)

谢谢

【问题讨论】:

  • 很高兴看到当我尝试使用 Unity 进行任何重要的事情时,我并不是唯一一个永远无法弄清楚发生了什么的人!
  • 哈哈,我刚刚在两秒钟前阅读了您关于统一和泛型的问题!顺便说一句,不错的公敌参考 :-)
  • 你是用注册名解析吗?

标签: .net generics unity-container


【解决方案1】:

您可以通过这种方式配置通用接口/实现:

<type name="customerChannelFactory" 
            type="System.ServiceModel.Channels.IChannelFactory`1, System.ServiceModel" 
            mapTo="System.ServiceModel.ChannelFactory`1, System.ServiceModel">
        <typeConfig>
          <constructor>
            <param name="binding" parameterType="System.ServiceModel.Channels.Binding, System.ServiceModel">
              <dependency name="customerBinding" />
            </param>
          </constructor>
        </typeConfig>
      </type>

更多详情msdn - Configuration Support for Generics

【讨论】:

  • 我如何将其限制为 ICustomerAccountProvider?因为我最终打算为具有不同绑定的不同类型建立多个通道工厂,所以我不确定这是否会长期有效?
  • 仅当 ChannelFactory 是 IChannelFactory 的通用实现时才有效。如果您有多个(非通用)通道工厂,则必须将每个通道工厂映射到特定实现:&lt;type name="customerChannelFactory"type="System.ServiceModel.Channels.IChannelFactory1[MyNameSpace.ICustomerAccountProvider], System.ServiceModel" mapTo="MyNameSpace.CustomerChannelFactory, System.ServiceModel">`跨度>
  • 这适用于通用ChannelFactory&lt;TChannel&gt;。我试过你的建议没有用
【解决方案2】:

经过大量搜索,这似乎在统一 1.2 中是不可能的? unity 1.2 似乎不支持开放的泛型类型,这个特性是在 unity 2.0 中引入的。

请参阅以下内容: http://davidhayden.com/blog/dave/archive/2008/03/25/UnityDependencyInjectionOpenGenericTypes.aspx

如果有人想证明不是这样,我会非常欢迎:-)

【讨论】:

  • 您注意到那篇博文上的日期了吗?这是2008年!那就是在 Unity 1.2 中添加新功能
  • 克里斯,不幸的是,我们被困在使用 1.1 中,所以这里是相关的。而且我没有简单的方法可以快速更改为使用新版本:-(
猜你喜欢
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多