【问题标题】:Unity configuration and nested generic typesUnity 配置和嵌套泛型类型
【发布时间】:2011-01-01 11:04:38
【问题描述】:

我是 Unity 新手,在 WCF 服务中的配置和嵌套泛型类型方面存在问题。一切正常,直到我遇到需要定义一个工厂来返回基于通用接口的类型实例的情况。

代码如下所示:

public interface IFactory<T, TResult>
{
    TResult CreateInstance(T input);
}

public interface IFilter<T>
{
    // throws an exception if an item is to be filtered
    void Filter(T itemToFilter);
}

// classes implementing this interface can have multiple filters    
public interface IFilterRunner<T>
{        
    void RunFilters(T itemToFilter);
}

public class FilterRunnerFactory : IFactory<BaseType, IFilterRunner<BaseType>>
{
    public IFilterRunner<BaseType> CreateInstance(BaseType input)
    {
        if (input is SubType)
        {
            return new SubTypeFilterRunner();
        }

        throw new InvalidOperationException("Could not create an IFilterRunner for the input.");
    }
}

public class Service
{
    private readonly IFactory<BaseType, IFilterRunner<BaseType>> _filterRunnerFactory;

    public Service(IFactory<BaseType, IFilterRunner<BaseType>> filterRunnerFactory)
    {
        _filterRunnerFactory = filterRunnerFactory;
    }    
}

Unity 配置如下所示:

<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
  <alias alias="BaseType" type="SomeNamespace.BaseType, SomeAssembly, Version=1.0.0.0, Culture=neutral" />
  <alias alias="IFactory" type="SomeNamespace.IFactory`2, SomeAssembly, Version=1.0.0.0, Culture=neutral" />
  <alias alias="IFilterRunner" type="SomeNamespace.IFilterRunner`1, SomeAssembly, Version=1.0.0.0, Culture=neutral" />
  <alias alias="IService" type="SomeNamespace.IService, SomeAssembly, Version=1.0.0.0, Culture=neutral" /> 
  <containers>
    <container>
      <register type="IFactory[BaseType,IFilterRunner]" mapTo="SomeNamespace.FilterRunnerFactory, SomeAssembly, Version=1.0.0.0, Culture=neutral"/>

      <register type="IService" mapTo="SomeNamespace.Service, SomeAssembly, Version=1.0.0.0, Culture=neutral">
        <constructor>
          <param name="filterRunnerFactory" />
        </constructor>
      </register>
    </container>
  </containers>
</unity>

配置似乎有效,但是当 WCF 服务本身被实例化时,我收到以下错误:

InvalidOperationException - 的 当前类型, SomeNamespace.IFactory2[SomeNamespace.BaseType,SomeNamespace.IFilterRunner1[SomeNamespace.BaseType]], 是一个接口,不能是 建造。你错过了一个类型 映射?

我尝试了各种不同的选项,但它们都导致配置无效。此外,我还有其他工厂定义被定义为返回抽象基类型或基于非泛型接口的类型实例,它们运行良好。不同之处在于该工厂返回 IFilterRunner - 一个通用接口。

有人有什么建议吗?提前感谢一位困惑的开发人员。

【问题讨论】:

    标签: c# generics dependency-injection unity-container


    【解决方案1】:

    我通过为 IFilterRunner 的别名指定通用参数解决了您的问题。

    <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
      <alias alias="BaseType" type="SomeNamespace.BaseType, SomeAssembly, Version=1.0.0.0, Culture=neutral" />
      <alias alias="IFactory" type="SomeNamespace.IFactory`2, SomeAssembly, Version=1.0.0.0, Culture=neutral" />
      <alias alias="IFilterRunner" type="SomeNamespace.IFilterRunner`1[[SomeNamespace.BaseType, SomeAssembly, Version=1.0.0.0, Culture=neutral]], SomeAssembly, Version=1.0.0.0, Culture=neutral" />
      <alias alias="IService" type="SomeNamespace.IService, SomeAssembly, Version=1.0.0.0, Culture=neutral" />
      <containers>
        <container>
          <register type="IFactory[BaseType,IFilterRunner]" mapTo="SomeNamespace.FilterRunnerFactory, SomeAssembly, Version=1.0.0.0, Culture=neutral"/>
    
          <register type="IService" mapTo="SomeNamespace.Service, SomeAssembly, Version=1.0.0.0, Culture=neutral">
            <constructor>
              <param name="filterRunnerFactory" />
            </constructor>
          </register>
        </container>
      </containers>
    </unity>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      • 2016-10-21
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多