c# - Autofac - 注册所有派生接口及其实现
问题描述
这是我要注册的接口的结构:
public interface IEventHandler
{
}
public interface IEventHandler<TEvent> : IEventHandler where TEvent : IEvent
{
void Handle(TEvent @event);
}
public class OnTrackPlayFoundWriteToDebug : IEventHandler<TrackPlayFoundEvent>
{
public void Handle(TrackPlayFoundEvent @event)
{
Debug.WriteLine($"Track found! It's from {@event.TrackPlay.Track.Artist.Name} called {@event.TrackPlay.Track.Name}");
}
}
public interface IEventPublisher
{
public void Publish<TEvent>(TEvent @event) where TEvent: IEvent;
}
public class EventPublisher : IEventPublisher
{
private readonly IEnumerable<IEventHandler> _eventHandlers;
public EventPublisher(IEnumerable<IEventHandler> eventHandlers)
{
_eventHandlers = eventHandlers;
}
public void Publish<TEvent>(TEvent @event) where TEvent : IEvent
{
var eventHandlersForEvent = _eventHandlers.OfType<IEventHandler<TEvent>>();
foreach (var eventHandler in eventHandlersForEvent)
{
eventHandler.Handle(@event);
}
}
}
因此,注册这个有多个问题,因为“实现” IEventHandler 的唯一事情是另一个接口,但我想要做的是确保基于通用 IEventHandler<> 接口,所有类都已注册,以便在一天结束时,EventPublisher 无需任何额外工作即可注入所有这些接口。但是我无法让这个工作。我试过这个注册:
public void ConfigureContainer(ContainerBuilder builder)
{
//configure auto fac here
builder.RegisterType<RecentTrackService>().As<IRecentTrackService>();
var assembly = Assembly.GetExecutingAssembly();
builder.RegisterAssemblyTypes(assembly)
.Where(t => t.IsAssignableFrom(typeof(IEventHandler)))
.AsImplementedInterfaces();
builder.RegisterAssemblyTypes(assembly)
.AsClosedTypesOf(typeof(IEventHandler<>));
builder.RegisterType<EventPublisher>().As<IEventPublisher>();
}
当我运行它时这不会失败,但 EventPublisher 中的 _eventHandlers 字段仍然为空。如何正确注册它以便它工作?
解决方案
推荐阅读
- android - react-native-webview 不适用于 android (RN 0.60.5)
- javascript - 按顺序执行promises map
- sql-server - JOOQ:案例表达式在为空时更新列值时抛出错误
- json - 创建 JSON 模式所需的帮助
- gradle - 未找到 ID 为“org.ajoberstar.grgit”的插件
- android - 无法在 Android 活动中显示 Admob 广告
- java - 如何才能将以下数据存储在适当的数据结构中?
- python - conda 环境已安装模块但未导入
- firebase - Flutter firebase 版本冲突 firebase 消息传递
- javascript - 当鼠标离开另一个站点时显示弹出窗口