【发布时间】:2016-11-27 13:03:45
【问题描述】:
我在解析映射到非通用类型的通用接口时遇到问题。
注册:
UnityContainer.RegisterType<IHandle<SomeEvent>, SomeHandler>();
//UnityContainer.RegisterType(typeof(IHandle<SupplierApprovedEvent>), typeof(TestHandler));
这就是我尝试解决它但没有成功的方法:
public static void GenericResolver<T>(T args) where T : IDomainEvent
{
var handlerType = typeof(IHandle<>).MakeGenericType(args.GetType());
var firstTry = container.GetServices(handlerType);// Resolve fails
var secondTry = container.GetServices(typeof(IHandle<T>)); // Resolve fails
var casted = args as IDomainEvent;
var handlerType2 = typeof(IHandle<>).MakeGenericType(casted.GetType());
var thirdTry = container.GetServices(handlerType2);// Resolve fails
var handlerType3 = typeof(IHandle<>).MakeGenericType(typeof(T));
var fourthTry = container.GetServices(handlerType3);// Resolve fails
}
我的界面:
public interface IDomainEvent {}
public interface IHandle<T>: IHandle where T : IDomainEvent
{
void Handle(T args);
}
public interface IHandle
{
void Handle(IDomainEvent args);
}
接口实现:
public class SomeHandler: IHandle<SomeEvent>
{
public void Handle(IDomainEvent args)
{
Handle(args as SomeEvent);
}
public void Handle(SomeEvent args)
{
//DO SOMETHING
}
}
我在这里想念什么:!?
更新:
1.没有例外。
2.GetService 返回 null。
3.这个解决方法很好,但不是我想要的:
var itsTypeofSomeHangled =(SomeHandler)injector.GetService(typeof(IHandle<SomeEvent>));
4.container在例子中是继承了IDependencyResolver的UnityDependencyResolver。这就是我调用 GetServices 和 GerService 方法的原因
更新 2: 原来问题出在 GetServices (ResolveAll)。这条线完美无缺,但我有不止一个这个 Gereric 接口的实现。
var handlerType = typeof(IHandle<>).MakeGenericType(args.GetType());
var xxxx = (IHandle)container.GetService(handlerType);
【问题讨论】:
-
GetServices是您自己创建的扩展方法吗?还是您的意思是改用Resolve? -
你为什么叫
container.GetServices而不是container.Resolve? -
容器是 UnityDependencyResolver 公开为 IDependencyResolver。这就是为什么它的 GetService 而不是 Resolve
-
您说“解决失败”,但没有在您的问题中添加异常详细信息(消息、类型、完整堆栈跟踪)。
-
你为什么用
GetServices而不是GetService?
标签: c# generics dependency-injection unity-container ioc-container