簡體   English   中英

Unity:注冊並解析實現通用接口的類

[英]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(...);
}

我吸取的教訓:

  1. 不要違反基本原則,但是目前看來有希望。
  2. 在該帖子中添加例外,因為它是有關問題信息的寶貴輸入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM