2016-03-16 107 views
0

我正嘗試使用泛型爲不同事件預訂處理程序。我有以下的接口和類:Unity:註冊並解析實現通用接口的類

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

你得到了什麼錯誤? – Domysee

回答

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. 在帖子中包含例外,因爲它是對問題信息的寶貴意見。
相關問題