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 (일반 인터페이스)를 반환한다는 것입니다.
누구에게 의견이 있습니까? 복잡한 개발자로부터 미리 감사드립니다.