Я пытаюсь внедрить некоторые 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();
}
}
Цените всю помощь, которую я могу получить, чтобы решить эту проблему, если она может быть решена.
Спасибо!