Unity:注册并解析实现通用接口的class

Unity : Register and resolve class that implements generic interface

我正在尝试使用泛型来为不同的事件订阅处理程序。我有以下接口和 classes:

public interface IEvent { }

public class CompletedEvent : IEvent { }

public interface IHandle<T> where T: IEvent { }

public class CompletedHandler : IHandle<CompletedEvent>  
{     
    public void Handle(CompletedEvent args)
    {  
        args.Completed.Path = "\...";
    }
}

我想像这样解决处理程序:

Container.ResolveAll<IHandle<T>>();

我尝试了几种方法在 Unity 中注册上述 class 但我没有成功。其中有

Container.RegisterType(typeof(IHandle<CompletedEvent>), typeof(CompletedHandler));

Container.RegisterType<IHandle<CompletedEvent>, CompletedHandler>();

谢谢!

我找到了问题的根源,如果有人跟我犯了同样的错误步骤,我会急于分享它和解决方案。原来我的注册没问题,问题出在handler factory,我违反了里氏代换原则。这是代码。

 public interface IEventFactory
 {
    IEvent Create(...);
 }

 public class CompletedEventFactory : IEventFactory
 {
    ...

    public IEvent Create(...)
    {
        return _container.Resolve<CompletedEvent>(new ParameterOverride(...));
    }

}

public class Service
{
    ...

    public void DoWork()
    {
        var completedEvent = _eventFactory.Create(...);
        DomainEvents.Raise(completedEvent);
    }

}

我的决心是在 Raise 方法中:

public static void Raise<T>(T args) where T : IDomainEvent
{
    ...

    Container.ResolveAll<IHandle<T>>();   
}

我捕获了一个 InvalidOperationException - 当前类型 ...IHandle`1[...IEvent] 是 一个接口,无法构造d。您是否缺少类型映射?

解决方法如下:

public interface IEventFactory
{
     CompletedEvent Create(...);
}

我学到的教训:

  1. 不要违反基本原则,无论目前看起来多么有前途。
  2. 在 post 中包含异常,因为它是对问题信息的宝贵输入。