“正确”的方式
在 DI 中注册您的自定义类,就像在ConfigureServices
方法,例如:
services.AddTransient<PermissionFactory>();
(代替AddTransient
, 您可以使用AddScoped
,或您需要的任何其他生命周期)
然后将此依赖项添加到控制器的构造函数中:
public CompanyInfoController(IOptions<AppSettings> appSettings, PermissionFactory permFact)
现在,DI 知道了PermissionFactory
,可以实例化它并将其注入到您的控制器中。
如果你想使用PermissionFactory
in Configure
方法,只需将其添加到其参数列表中即可:
Configure(IApplicationBuilder app, PermissionFactory prov)
Aspnet 将发挥它的魔力并将类注入其中。
“恶心”的方式
如果你想实例化PermissionFactory
在代码深处的某个地方,您还可以用一种有点令人讨厌的方式来做到这一点 - 存储对IServiceProvider
in Startup
class:
internal static IServiceProvider ServiceProvider { get;set; }
Configure(IApplicationBuilder app, IServiceProvider prov) {
ServiceProvider = prov;
...
}
现在您可以像这样访问它:
var factory = Startup.ServiceProvider.GetService<PermissionFactory>();
同样,DI 将负责注入IOptions<AppSettings>
into PermissionFactory
.
Asp.Net 依赖注入中的 5 个文档