我正在尝试使用泛型来为不同的事件订阅处理程序。我有以下接口和类:
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>();
谢谢!
答案 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(...);
}
我学到的经验教训: