统一配置打开泛型类型

时间:2010-09-21 11:21:13

标签: .net generics unity-container

我正在尝试使用unity来解析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<ISomeType>而不适用于IChannelFactory<ISomeOtherType>。或许这不是正确的做事方式吗?

如果我只是尝试孤立地解析Binding,它说它不能从其他构造函数中取一个参数消除歧义(即使我将param类型定义为字符串!)

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

由于

2 个答案:

答案 0 :(得分:0)

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

<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

的更多详情

答案 1 :(得分:0)

经过多次搜索,似乎这在团结1.2中可能是不可能的?看来unity 1.2不支持开放泛型类型,这个特性是在unity 2.0中引入的。

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

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