【发布时间】:2020-03-18 02:02:45
【问题描述】:
我最近迁移到 ASP.NET Core 3.0 并在启动时遇到了 DI 问题……他们在 ASP.NET Core 2.2 上运行良好。如果我在 ASP.NET CORE 3.0 中使用旧的 WebHostBuilder,那么我看不到这些问题。不确定这些问题是特定于 Program.cs 中的新 HostBuilder 还是 3.0 中的 DI 已更改。
Program.cs
public class Program
{
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
}
我有如下的 UniqueRowKeyUserStore 类。构造函数采用 4 个接口。
public class UniqueRowKeyUserStore : UserStore<UniqueRowKeyUser>
{
public UniqueRowKeyUserStore(IStoreMetadata storeMetadata, ILookupNormalizer dataNormalizer, IDataProtector dataProtector, ILookupSplitter<StorablePartitionRowKeys> defaultMerger) : base(storeMetadata, dataNormalizer, dataProtector, defaultMerger)
{ }
}
在配置服务中,我使用工厂函数注册了一个作用域服务
services.AddScoped<UniqueRowKeyUserStore>(StartupService.NewUserStore);
StartupService.NewUserStore 是创建 UniqueRowKeyUserStore 实例的工厂方法
public static UniqueRowKeyUserStore NewUserStore(IServiceProvider arg)
{
return new UniqueRowKeyUserStore(new DefaultMetadata(), new DefaultNormalizer(), new DefaultProtecttor(), new DefaultSplitter());
}
如您所见,我使用 Factory 方法来创建实例,因此期望 DI 不应抱怨 IStoreMetadata 或构造函数中预期的其他接口。
但我在启动过程中遇到错误,看起来 asp.net core 3.0 中的 DI 忽略了工厂方法?
InvalidOperationException:尝试激活“UniqueRowKeyUserStore”时无法解析“IStoreMetadata”类型的服务。
我不确定我在 ASP.NET Core 3.0 中做错了什么
【问题讨论】:
-
您是否尝试过手动进行工厂以确保?
services.AddScoped<UniqueRowKeyUserStore>(sp => return new UniqueRowKeyUserStore(...)); -
我无法重现该问题。首先,我的Identity的
UserStore没有这样的构造函数,也没有IStoreMetadata或ILookupSplitter,所以我不确定你用的是哪一个。其次,如果都正确的话,VS应该会告诉你可以在AddScoped处去掉<UniqueRowKeyUserStore>吧? -
@Nkosi 是的,我按照您的建议手动尝试了工厂,但同样的问题......
-
.AddUserStore<UniqueRowKeyUserStore>()是导致问题的原因。 -
@Ameya 我找到了源代码,看看为什么它会导致你的问题
标签: c# asp.net-mvc asp.net-core dependency-injection