Unity:注册并解析实现通用接口的class
Unity : Register and resolve class that implements generic interface
我正在尝试使用泛型来为不同的事件订阅处理程序。我有以下接口和 classes:
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 中注册上述 class 但我没有成功。其中有
Container.RegisterType(typeof(IHandle<CompletedEvent>), typeof(CompletedHandler));
和
Container.RegisterType<IHandle<CompletedEvent>, CompletedHandler>();
谢谢!
我找到了问题的根源,如果有人跟我犯了同样的错误步骤,我会急于分享它和解决方案。原来我的注册没问题,问题出在handler factory,我违反了里氏代换原则。这是代码。
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(...);
}
我学到的教训:
- 不要违反基本原则,无论目前看起来多么有前途。
- 在 post 中包含异常,因为它是对问题信息的宝贵输入。
我正在尝试使用泛型来为不同的事件订阅处理程序。我有以下接口和 classes:
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 中注册上述 class 但我没有成功。其中有
Container.RegisterType(typeof(IHandle<CompletedEvent>), typeof(CompletedHandler));
和
Container.RegisterType<IHandle<CompletedEvent>, CompletedHandler>();
谢谢!
我找到了问题的根源,如果有人跟我犯了同样的错误步骤,我会急于分享它和解决方案。原来我的注册没问题,问题出在handler factory,我违反了里氏代换原则。这是代码。
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(...);
}
我学到的教训:
- 不要违反基本原则,无论目前看起来多么有前途。
- 在 post 中包含异常,因为它是对问题信息的宝贵输入。