如何创建 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)
{
}
}
新的 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)
{
}
}