[英]Unity : Register and resolve class that implements generic interface
我正在嘗試使用泛型將處理程序訂閱到不同的事件。 我有以下接口和類:
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>();
謝謝!
我發現了問題的根源,如果有人正在按照與我相同的錯誤步驟進行操作,我急於分享它和解決方案。 原來我的注冊還可以,但是問題出在處理程序工廠,我違反了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(...);
}
我吸取的教訓:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.