2016-03-16 52 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. 在帖子中包含例外,因为它是对问题信息的宝贵意见。
相关问题