C# Autofac如何在运行时注册和解析通用接口?

C# Autofac如何在运行时注册和解析通用接口?,c#,generics,dependency-injection,interface,autofac,C#,Generics,Dependency Injection,Interface,Autofac,我在运行时解析通用接口实现时遇到问题。我正在使用一个eventbus,它将根据事件的类型解析EventHandler。当我尝试在没有通用实现的情况下解析EventHandler时,一切都按预期进行。我想实现一个通用接口,这样我就可以有一个基类来处理特定类型的事件 在创建通用实现之前,我遇到了以下情况: 公共接口事件 { Guid EntityId{get;set;} } 公共接口IEventHandler,其中TEvent:IEvent { 任务句柄(TEvent@event); } 公共类活动

我在运行时解析通用接口实现时遇到问题。我正在使用一个eventbus,它将根据事件的类型解析EventHandler。当我尝试在没有通用实现的情况下解析EventHandler时,一切都按预期进行。我想实现一个通用接口,这样我就可以有一个基类来处理特定类型的事件

在创建通用实现之前,我遇到了以下情况:

公共接口事件
{
Guid EntityId{get;set;}
}
公共接口IEventHandler,其中TEvent:IEvent
{
任务句柄(TEvent@event);
}
公共类活动巴士
{
私有只读IComponentContext_context;
公共事件总线(IComponentContext)
{
_上下文=上下文;
}
公共异步任务HandleEvent(TEvent@event),其中TEvent:IEvent
{
var handler=_context.Resolve();
wait handler.Handle(@event);
}
}
我按如下方式注册EventHandler:

builder.RegisterAssemblyTypes(此程序集).AsClosedTypesOf(typeof(IEventHandler));
实施示例:

公共类FooEventHandler:
伊文坦德勒,
伊文坦德勒,
伊文坦德勒
{
专用只读IRepository存储库;
公共FooEventHandler(IRepository存储库)
{
_存储库=存储库;
}
公共异步任务句柄(FooArchivedEvent@event)
{
var Foo=await_repository.Get(@event.EntityId);
Foo.Archive();
}
公共异步任务句柄(FooRestoreEvent@event)
{
var Foo=await_repository.Get(@event.EntityId);
Foo.Restore();
}
公共异步任务句柄(FooSomethingElseHappenedEvent@event)
{
//用Foo做点别的
}
}
公共类BarEventHandler:
伊文坦德勒,
伊文坦德勒
{
专用只读IRepository存储库;
公共存储库(IRepository repository)
{
_存储库=存储库;
}
公共异步任务句柄(BarArchivedEvent@event)
{
var Bar=await_repository.Get(@event.EntityId);
Bar.Archive();
}
公共异步任务句柄(BarRestoredEvent@event)
{
var Bar=await_repository.Get(@event.EntityId);
Bar.Restore();
}
}
当我将FooArchivedEvent传递给eventbus时,eventbus将解析所需的eventhandler。如您所见,我有一些重复的代码,希望在基本eventhandler中解析。这是我在创建泛型实现(不会编译)之前尝试的:

公共类BaseEventHandler:
伊文坦德勒,
伊文坦德勒
地点:班级
TArchivedEvent:IEvent在哪里
TRestoredEvent:IEvent在哪里
{
公共任务句柄(TArchivedEvent@event)
{
抛出新的NotImplementedException();
}
公共任务句柄(TRestoredEvent@event)
{
抛出新的NotImplementedException();
}
}
因此,我创建了一个可以编译的泛型基类,但是我不知道如何在eventbus中解析泛型eventhandler。 泛型基类:

public abstract class BaseEventHandler<TEntity> :
        IEventHandler<IArchivedEvent<TEntity>>,
        IEventHandler<IRestoredEvent<TEntity>>
        where TEntity : Archivable
    {
        protected readonly IRepository<TEntity> _repository;

        public BaseEventHandler(IRepository<TEntity> repository)
        {
            _repository = repository;
        }

        public virtual async Task Handle(IArchivedEvent<TEntity> @event)
        {
            var entity = await _repository.Get(@event.EntityId);
            entity.Archive();
        }

        public async virtual Task Handle(IRestoredEvent<TEntity> @event)
        {
            var entity = await _repository.Get(@event.EntityId);
            entity.Archive();
        }
    }
公共抽象类BaseEventHandler:
伊文坦德勒,
伊文坦德勒
触角:可拱起
{
受保护的只读存储库;
public BaseEventHandler(IRepository存储库)
{
_存储库=存储库;
}
公共虚拟异步任务句柄(IArchivedEvent@event)
{
var entity=await_repository.Get(@event.EntityId);
entity.Archive();
}
公共异步虚拟任务句柄(IRestoredEvent@event)
{
var entity=await_repository.Get(@event.EntityId);
entity.Archive();
}
}
我的新FooEventHandler现在如下所示:

公共类FooEventHandler:BaseEventHandler,
伊文坦德勒
{
public FooEventHandler(IRepository存储库):基本(存储库)
{
}
公共任务句柄(FooSomethingElseHappenedEvent@event)
{
//用Foo做点别的
}
}

现在,当我将FooArchivedEvent传递给eventbus时,eventbus无法解析eventhandler。在注册部分我需要做些什么,还是不可能解决这样的通用实现?

我最终编写了一个方法,用于检查某个类型的每个接口是否有注册的处理程序:

私有IEventHandler GetHandler(Type=null),其中TEvent:IEvent
{
对象处理器;
类型=类型??类型(TEvent);
if(_container.TryResolve(typeof(IEventHandler).MakeGenericType(type),out处理程序))
{
返回(IEventHandler)处理程序;
}
其他的
{
foreach(类型.GetInterfaces()中的var t)
{
var h=GetHandler(t);
如果(h!=null)
返回h;
}
}
返回null;
}