首页 > 解决方案 > 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 字段仍然为空。如何正确注册它以便它工作?

标签: c#asp.net-coreautofac

解决方案


推荐阅读