我正在尝试在解决方案中实现某些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();
}
}
感谢我能解决此问题的所有帮助。
谢谢!
答案 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.
那仅仅是开始。继续阅读,您应该了解该异常实际上是什么,并可能获得有关如何解决该异常的指导。同样,请观看“调试”窗口,您可能会在其中找到一些日志。