c# - ASP.Net Core 3.0 依赖注入(inject)忽略工厂方法?

标签 c# asp.net-mvc asp.net-core dependency-injection

我最近迁移到 ASP.NET Core 3.0 并在启动时面临 DI 问题......它们在 ASP.NET Core 2.2 上运行良好。如果我在 ASP.NET CORE 3.0 中使用旧的 WebHostBuilder,那么我看不到问题。不确定问题是特定于 Program.cs 中的新 HostBuilder 还是 DI 在 3.0 中发生了变化。

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 个接口(interface)。

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 或构造函数中期望的其他接口(interface)。

但是我在启动过程中得到了错误,看起来确实像 asp.net core 3.0 中的 DI 忽略了工厂方法 ?

InvalidOperationException:尝试激活“UniqueRowKeyUserStore”时无法解析类型“IStoreMetadata”的服务。

我不确定我在 ASP.NET Core 3.0 中做错了什么

最佳答案

.AddUserStore<UniqueRowKeyUserStore>()是什么导致了问题。

/// <summary>
/// Adds an <see cref="IUserStore{TUser}"/> for the <see cref="UserType"/>.
/// </summary>
/// <typeparam name="TStore">The user store type.</typeparam>
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
public virtual IdentityBuilder AddUserStore<TStore>() where TStore : class
    => AddScoped(typeof(IUserStore<>).MakeGenericType(UserType), typeof(TStore));

Source

注意它是如何添加为 IUserStore<>

所以你是对的,它没有调用你的实现注册。它正在寻找抽象。

关于c# - ASP.Net Core 3.0 依赖注入(inject)忽略工厂方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58986776/

相关文章:

asp.net-core - 升级到预览版 6 后 Blazor 子应用程序 404 错误

c# - 按钮变灰,直到所有文本框都包含 ASP 中的文本

javascript - Jquery on Change 函数未在 asp.net MVC 中触发

asp.net-mvc - 如何在mvc中的 Controller 中对 session 变量进行单元测试

jquery - 基于多个单选按钮显示 div

asp.net-core - 获取分配角色的用户

c# - 循环内嵌套任务

c# - 将 DWORD 从 C++ 返回到 C# (DllImport)

angularjs - 使用 $http.delete 从 Angular 发布到 aspnetcore api 时出现不支持的媒体类型错误