[英]Get dependency when needed?
有什么方法可以僅在需要時獲取/獲取依賴項?
public class DependentClass
{
public DependentClass(IMandatoryDependency mandatoryDependency, IDependency1 dependency1, IDependency2 dependency2, IDependency3 dependency3)
{
// Assigned to class level property
}
public void MethodsOne()
{
mandatoryDependency.CallMandatoryMethod();
dependency1.CallDependecy1Method();
}
public void MethodsTwo()
{
mandatoryDependency.CallMandatoryMethod();
dependency2.CallDependecy2Method();
}
public void MethodsThree()
{
mandatoryDependency.CallMandatoryMethod();
dependency3.CallDependecy3Method();
}
}
從上面的片段中,當我在方法本身中時,我想獲得各個方法的依賴項。 像這樣的東西:
public class DependentClass
{
public DependentClass(IMandatoryDependency mandatoryDependency)
{
// Assigned to class level property
}
public void MethodsOne()
{
mandatoryDependency.CallMandatoryMethod();
DIContainer.GetDependency<IDependency1>().CallDependecy1Method();
}
public void MethodsTwo()
{
mandatoryDependency.CallMandatoryMethod();
DIContainer.GetDependency<IDependency2>().CallDependecy2Method();
}
public void MethodsOne()
{
mandatoryDependency.CallMandatoryMethod();
DIContainer.GetDependency<IDependency3>().CallDependecy3Method();
}
}
在 asp.net core 中,我們可以在控制器中注入IServiceProvider
並在運行時IServiceProvider
解決依賴項,例如:
private IServiceProvider _serviceProvider;
private IMandatoryDependency _mandatoryDependency;
public DependentClass(IMandatoryDependency mandatoryDependency,
IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
_mandatoryDependency = mandatoryDependency;
}
在方法中,我們可以請求提供者提供特定依賴項的實例,例如:
public void MethodsOne()
{
mandatoryDependency.CallMandatoryMethod();
_serviceProvider.GetService(typeof(IDependency1)).CallDependecy1Method();
}
但是注入IServiceProvider
並不是一個好主意,請參閱:
為什么不注入 IServiceProvider 而不是每個單獨的依賴項?
您可以在以下位置查看有關依賴項注入服務的更多詳細信息,特別是在 asp.net core 中:
https://andrewlock.net/new-in-asp-net-core-3-service-provider-validation/
http://www.binaryintellect.net/articles/17ee0ba2-99bb-47f0-ab18-f4fc32f476f8.aspx
另請閱讀有關 asp.net 核心中依賴注入的最佳實踐:
您需要在StartUp.cs
服務注冊為StartUp.cs
。
services.AddTransient<IDependecy1, Dependecy1>();
services.AddTransient(serviceProvider => new Lazy<IDependecy1>(() => serviceProvider.GetRequiredService<IDependecy1>()));
然后在你的Controller
使用依賴作為懶惰
public class DependentClass
{
private readonly Lazy<IDependency1> _dependency1;
public DependentClass(IMandatoryDependency mandatoryDependency, Lazy<IDependency1> dependency1)
{
// Assigned to class level property
_dependency1 = dependency1;
}
public void MethodsOne()
{
mandatoryDependency.CallMandatoryMethod();
_dependency1.Value.CallDependecy1Method();
}
}
如果您僅在一種方法中使用 IDependency1,那么您可以在.NET 核心中使用FromServices解決依賴項,而不是在構造函數中注入依賴項。
public void MethodsOne([FromServices] IDependency1 dependency1)
{
mandatoryDependency.CallMandatoryMethod();
dependency1.CallDependecy1Method();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.