【问题标题】:Resolve Interface<T> with Unity使用 Unity 解析接口<T>
【发布时间】: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


【解决方案1】:

我发现了问题所在。 Unity resolve all 无法按照我在示例中所期望的方式工作。 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 中明显...

【讨论】:

    猜你喜欢
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多