INotificationHandler MediatR

时间:2019-06-19 08:21:40

标签: c# .net autofac mediator

我正在尝试在解决方案中实现某些MediatR INotification 。 我的问题是我无法弄清楚如何在一个 INotificationHandler <> 中注入接口“ ISchemaRepository ”。 MediatR和下面的所有类都在我的ASP.NET Core项目中, ISchemaRepository 在另一个.NET核心类库中,而' SchemaRepository ”位于一个不同的ASP.NET Core项目。基本上我想达到的目标是从一个数据库中获取数据,然后插入另一个项目中的另一个数据库中。

我已经阅读了许多有关MediatR的文章,但是havnt找到了有关如何实现这一点的任何示例。甚至可以将接口注入到' INotificationHandler <> '中吗? 我知道我可能陷入困境,但在编程方面我还是个菜鸟。

当我以以下状态运行应用程序时,出现异常:

“激活λ:MediatR.INotificationHandler`1 [[Facade.Application.Events.GetScheduleEvent,Facade,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]] []-引发异常> Facade.Application.Events.ScheduleEventHandler-> ServiceApi.Repository.SchemaRepository。“

我在ApplicationModule和MediatorModule中尝试了几种不同的解决方案,因为我猜测这与依赖项注入有关。我最好的猜测是添加

            builder.RegisterType<ScheduleEventHandler>()
            .As<ISchemaRepository>()
            .InstancePerLifetimeScope();

到我的“ ApplicationModule”,但随后在启动时出现此异常:

“ System.ArgumentException   HResult = 0x80070057   Message =类型'Facade.Application.Events.ScheduleEventHandler'无法分配给服务'Service.InternalResourceRepository.ISchemaRepository'。   来源= Autofac   堆栈跟踪:    在C:\ projects \ autofac \ src \ Autofac \ Builder \ RegistrationBuilder.cs:line 192中的Autofac.Builder.RegistrationBuilder.CreateRegistration(Guid id,RegistrationData数据,IInstanceActivator激活器,Service []服务,IComponentRegistration目标)处 “

这是我的INotificationHandler <>:

    public class ScheduleEventHandler : INotificationHandler<GetScheduleEvent>
{
    private readonly ISchemaRepository _repository;
    public ScheduleEventHandler(ISchemaRepository repository)
    {
        _repository = repository;
    }

    public Task Handle(GetScheduleEvent notification, CancellationToken cancellationToken)
    {
        _repository.SeedSchedule();

        return Task.CompletedTask;
    }
}

'GetScheduleEvent'只是一个用'INotification'声明的空类。

这是我的“ MediatorModule”:

    public class MediatorModule : Autofac.Module
{
    /// <summary>
    /// Implementing the Mediator
    /// </summary>
    /// <param name="builder"></param>
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterAssemblyTypes(typeof(IMediator).GetTypeInfo().Assembly)
            .AsImplementedInterfaces();            

        //Events
        builder.RegisterAssemblyTypes(typeof(ScheduleEventHandler).GetTypeInfo().Assembly)
            .AsClosedTypesOf(typeof(INotificationHandler<>));

        builder.Register<ServiceFactory>(context =>
        {
            var componentContext = context.Resolve<IComponentContext>();
            return t => { object o; return componentContext.TryResolve(t, out o) ? o : null; };
        });

    }
}

您可以看到我正在使用AutoFac。这是我的ApplicationModule:

   public class ApplicationModule : Autofac.Module
{

    public string QueriesConnectionString { get; }

    public ApplicationModule(string qconstr)
    {
        QueriesConnectionString = qconstr;

    }

    protected override void Load(ContainerBuilder builder)
    {

        builder.RegisterType<SchemaRepository>()
            .As<ISchemaRepository>()
            .InstancePerLifetimeScope();
    }
}

感谢我能解决此问题的所有帮助。

谢谢!

1 个答案:

答案 0 :(得分:1)

builder.RegisterType<ScheduleEventHandler>()
            .As<ISchemaRepository>()
            .InstancePerLifetimeScope();

这是“我解决ISchemaRepository时我希望您给我一个新的ScheduleEventHandler

public class ScheduleEventHandler : INotificationHandler<GetScheduleEvent>

ScheduleEventHandler未实现ISchemaRepository。这不是Autofac,而是您尚未实现该界面。

例如,这也会失败:

var s = new ScheduleEventHandler();
var r = (ISchemaRepository)s;

您只能注册类型As<T>实现或派生的事物。

如果您想对原始异常进行故障排除,则需要查看内部异常消息。

An exception was thrown while activating λ:MediatR.INotificationHandler`1[[Facade.Application.Events.GetScheduleEvent, Facade, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]][] -> Facade.Application.Events.ScheduleEventHandler -> ServiceApi.Repository.SchemaRepository.

那仅仅是开始。继续阅读,您应该了解该异常实际上是什么,并可能获得有关如何解决该异常的指导。同样,请观看“调试”窗口,您可能会在其中找到一些日志。