无法加载类型“MediatR.ServiceFactory”。

22

我正在创建一个Api,同时也在使用mediatR,我已经创建了我的命令、查询和处理程序,但是当我尝试启动我的Api时,在我的程序类中出现了以下错误消息:

Could not load type 'MediatR.ServiceFactory' from assembly 'MediatR, Version=12.0.0.0, Culture=neutral, PublicKeyToken=bb9a41a5e8aaa7e2'.

我会尽力为您翻译。以下是您需要翻译的内容:

我在程序类中注册我的mediatR,代码如下:

builder.Services.AddMediatR(Assembly.GetExecutingAssembly());

我已经安装了 MediatR(最新版本:12.0.0)和 MediatR.Extensions.Microsoft.DependencyInjection(版本:11.0.0),因为目前的最新版本(11.1.0)已经被弃用。

enter image description here

我正在使用 .Net 6,有什么可能的解决方案吗?谢谢提前。

4个回答

54

MediatR 12的更新附带了迁移指南此处

为解决您的问题,请替换

builder.Services.AddMediatR(Assembly.GetExecutingAssembly());

使用

services.AddMediatR(cfg=>cfg.RegisterServicesFromAssemblies(Assembly.GetExecutingAssembly()));

如果您有来自另一个(单个)程序集的处理程序,可以尝试以下方法:
 services.AddMediatR(cfg=>cfg.RegisterServicesFromAssemblies(typeof(MyCoolThingInAnotherAssemblyRequestHandler).GetTypeInfo().Assembly));

要使用上述任何扩展方法...您可能需要添加:

using MediatR;

来自迁移指南

通过配置对象独占地进行服务注册 以前,通过IServiceCollection进行的服务注册有多种选项。现在,这些选项已经合并到单个MediatrServiceConfiguration对象中。传递要扫描的程序集的重载现在需要改为使用此配置对象上的方法进行注册:


8
如果有使用 Autofac 的人看到这篇文章,请将已弃用的 ServiceFactory 注册转换。
builder.Register<ServiceFactory>(ctx =>
{
  var c = ctx.Resolve<IComponentContext>();
  return t => c.Resolve(t);
});

根据以下示例,返回已填充的ServiceCollection

var services = new ServiceCollection();
        
builder.Populate(services);

谢谢。这正是我在寻找的内容。我正在使用ardalis的清洁架构模板,它使用了这个设置。 - Rod Talingting

2
非常简单。为了解决你的问题,只需在你的 Program.cs 类中添加以下行。
builder.Services.AddMediatR(x => x.RegisterServicesFromAssemblies(typeof(LibraryEntrypoint).Assembly));

这里的"LibraryEntrypoint"是在项目文件夹中创建的一个空类,仅用于引用我的项目的程序集。如果您愿意,可以添加任何类。

internal class LibraryEntrypoint
{

}

感谢您!

0
在我的情况下,结果发现使用了不同版本的 MediatR nuget 包。在一个程序集中,是 ``,而在另一个程序集中是 ``。 解决办法是使所使用的 nuget 包版本保持一致。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接