如何创建 class 的实例并注入服务?

How to create instance of a class and inject services?

新的 aspnet 具有内置依赖注入:启动 class 实例接收服务,控制器,视图组件接收服务。我有什么方法可以创建我的 class 对象并使用 aspnet 功能传递服务吗?类似于:

WebApplicationClassesActivator.Create(typeof(MyClass))

其中 MyClass 包含接收 IHostingEnvironment 实例的构造函数,例如。

实际用法:

public class MyController : Controller
{
    private readonly IContext Context;
    public MyController(IContext context)
    {
        Context = context;
    }
    public IActionResult Index(string className)
    {            
        return View(WebApplicationClassesActivator.Create(Type.GetType(className)));
    }
}

其中 classsName 是 class 的名称,例如:

public class A
{
    public A(IContext context, IHostingEnvironment env)
    {
       ...
    }
}

嗯,你可以通过以下方式来完成:

public class MyController : Controller
{
    private readonly IContext Context;
    private readonly IServiceProvider _Provider;

    public MyController(IContext context, IServiceProvider provider)
    {
        Context = context;
        _Provider = provider;
    }

    public IActionResult Index(string className)
    {            
        return View(_Provider.GetService(Type.GetType(className)));
    }
}

当然,您计划以这种方式实例化的每个 class 都应该添加到 ConfigureServices 中,例如:

services.AddTransient<MyClass, MyClass>();

另请注意 - 此实现实际上是服务定位器,通常被视为设计反模式。

程序集 Microsoft.Extensions.DependencyInjection.Abstractions 包含静态 class ActivatorUtilities,其中包含我需要的内容:

public static object CreateInstance(IServiceProvider provider, 
                                    Type instanceType, 
                                    params object[] parameters);

我可以创建实例并注入服务:

private readonly IServiceProvider Provider;

public HomeController(IServiceProvider provider)
{       
    Provider = provider;
}

public IActionResult Index()
{       
    var instance = ActivatorUtilities.CreateInstance(Provider, typeof(A));

    return View(instance);
}

public class A
{
    public A(IContext context)
    {

    }
}