2011-01-01 8 views
4

Unity에 익숙하지 않으며 WCF 서비스의 구성 및 중첩 된 제네릭 형식에 문제가 있습니다. 제네릭 인터페이스를 기반으로하는 유형의 인스턴스를 반환하는 팩토리를 정의해야하는 상황에 이르기까지 모든 것이 제대로 작동했습니다.유니티 구성 및 중첩 된 제네릭 형식

<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 서비스 자체가 인스턴스화 될 때 나는 다음과 같은 오류가 발생합니다 :

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; 
    }  
} 

유니티 구성은 다음과 같은 :

코드는 다음과 같이 보입니다 :

InvalidOperationException - The current type, SomeNamespace.IFactory 2[SomeNamespace.BaseType,SomeNamespace.IFilterRunner 1[SomeNamespace.BaseType]], is an interface and cannot be constructed. Are you missing a type mapping?

모든 종류의 다양한 옵션을 시도했습니다. b 그들은 모두 잘못된 구성을 초래합니다. 또한, 나는 추상적 인 기본 유형 또는 비 제네릭 인터페이스를 기반으로하는 유형의 인스턴스를 반환하도록 정의 된 다른 팩토리 정의를 가지고 있으며 잘 작동했습니다. 차이점은이 팩토리는 IFilterRunner (일반 인터페이스)를 반환한다는 것입니다.

누구에게 의견이 있습니까? 복잡한 개발자로부터 미리 감사드립니다.

답변

2

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>