首页 > 解决方案 > 向 dotnet core 3 注册 Open Generic

问题描述

我正在尝试在我的应用程序中注册一个 Open Generic 类型,但我的行为很奇怪。

以下工作正常:

services.AddTransient(typeof(IA<>), typeof(A<>));

现在,我想将参数传递给我的A类,因为我的构造函数有一些参数:

services.AddTransient(typeof(IA<>), provider =>
{
    return ActivatorUtilities.CreateInstance(provider, typeof(A<>), "1", "2");
});

这会产生异常

'开放通用服务类型 'IA`1[T]' 需要注册开放通用实现类型。(参数'描述符')'

好的,所以我简化了我的工厂,只是做了这样的事情:

services.AddTransient(typeof(IA<>), provider => typeof(A<>));

但这会产生完全相同的异常。

问题很简单:如何使用默认的 .net core DI 注册带有参数的 Open Generic?(我不想使用像 Castle Windsor 这样的第三方库)

请注意,构造函数A<>具有可选参数,这就是services.AddTransient(typeof(IA<>), typeof(A<>));工作的原因

标签: c#generics.net-coredependency-injection

解决方案


您可以将参数的构造函数包装A<>到一个类中并注入它而不是传递参数

services.AddTransient(typeof(IA<>), typeof(A<>));
services.AddTransient<AOptions>(sp => new AOptions { X = "1", Y = "2" });
public class A<T> : IA<T>
{
    private readonly AOptions _aOptions;

    public A(AOptions aOptions = null)
    {
        _aOptions = aOptions;
    }
}

public class AOptions
{
    public string X { get; set; }
    public string Y { get; set; }
}

推荐阅读