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

本文关键字:实例 注入 服务 何创建 创建 | 更新日期: 2023-09-27 18:30:02

新的aspnet具有内部依赖注入:启动类实例接收服务,控制器,视图组件接收服务。有什么方法可以让我创建类的对象并使用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是类的名称,如:

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

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

Assembly Microsoft.Extensions.DependencyInjection.Abstractions包含静态类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)
    {
    }
}

好吧,你可以用以下方式来做:

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)));
    }
}

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

services.AddTransient<MyClass, MyClass>();

还要注意,这个实现实际上是服务定位器,它经常被认为是设计反模式。