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

时间:2016-03-16 21:10:04

标签: c# generics unity-container

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

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中注册上述类的方法,但是我没有成功。其中有

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

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

谢谢!

1 个答案:

答案 0 :(得分:1)

我找到了问题的根源,我急于分享它和一个解决方案,如果有人采取了同样的错误步骤。事实证明我的注册没问题,但问题出在处理器工厂,我违反了Liskov替换原则。这是代码。

 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. 在帖子中包含例外,因为它是有关问题信息的宝贵输入。