Внедрить интерфейс в INotificationHandler MediatR - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь внедрить некоторые MediatR INotification в моем решении.Моя проблема заключается в том, что я не могу понять, как можно внедрить интерфейс ' ISchemaRepository ' в один INotificationHandler <> .MediatR и все приведенные ниже классы находятся в моем проекте ASP.NET Core, а ISchemaRepository находится в другой библиотеке базовых классов .NET, а ' SchemaRepository ' находится в другомОсновной проект ASP.NET.По сути, я хочу получить данные из одной базы данных и вставить ее в другую базу данных в другом проекте.

Я читал много статей, касающихся MediatR, но не нашел никаких примеров того, как этого добиться.Можно ли даже вставить интерфейс в ' INotificationHandler <> '?Я знаю, что, возможно, я нахожусь в глубокой воде, и я все еще немного новичок в программировании.

Когда я запускаю приложение в следующем состоянии, я получаю исключение:

"Возникла исключительная ситуация при активации λ: MediatR.INotificationHandler`1 [[Facade.Application.Events.GetScheduleEvent, Facade, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null]] [] -> Facade.Application.Events.ScheduleEventHandler -> ServiceApi.Repository.SchemaRepository. "

Я попробовал несколько различных решений в моем ApplicationModule и MediatorModule, так как я предполагаю, что это связано с внедрением зависимости.Моим лучшим предположением было добавить

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

к моему ApplicationModule, но затем я получаю это исключение при запуске:

"System.ArgumentException HResult = 0x80070057 Message = The type 'Facade.Application.Events.ScheduleEventHandler 'нельзя назначить для службы' Service.InternalResourceRepository.ISchemaRepository '. Source = Autofac StackTrace: at Autofac.Builder.RegistrationBuilder.CreateRegistration (идентификатор Guid, данные службы регистрации, Service Services ICponent, Reponent Service Regent], IInstanceActiv]target) в C: \ projects \ autofac \ src \ Autofac \ Builder \ RegistrationBuilder.cs: строка 192 "

Это мой 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 Ответ

1 голос
/ 19 июня 2019
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.

Это только начало. Продолжайте читать, вы должны увидеть , что это исключение на самом деле было и, возможно, получить некоторые рекомендации о том, как это исправить. Смотрите также окно «Отладка», там вы можете получить несколько журналов.

...