我有一个解析通用接口映射到非通用类型的问题。

注册:

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和GerSevice的原因

UPDATE2:
原来,问题出在GetServices(ResolveAll)中。这条线工作完美,但是我有这个Gereric接口的多个实现。

var handlerType = typeof(IHandle<>).MakeGenericType(args.GetType());
var xxxx = (IHandle)container.GetService(handlerType);

最佳答案

我发现了问题所在。 Unity不能全部解决我在示例中期望的方式。 this主题中的Scott Chamberlain解释涵盖了这一点。

解:

    var handlerType = typeof(IHandle<>).MakeGenericType(args.GetType());
    var handlers = resolver.Container.Registrations
                       .Where(x => x.RegisteredType.IsGenericType && x.RegisteredType == handlerType)
                       .Select(x => (IHandle)resolver.GetService(x.RegisteredType));

    foreach (IHandle item in handlers)
    {
        item.Handle(args);
    }


基本上,我在这里所做的是查询容器注册以查找我的处理程序类型。比在.Select中,我使用特定的registration.RegisteredType参数调用GetService(Resolve),然后将其强制转换。比在foreach中明显...

10-02 04:10