簡體   English   中英

需要時獲得依賴?

[英]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();
    }
}

假設你使用的是IOC容器,你可以注入其自身的構造函數,然后用這個實例來解決你的服務不好它不是一個很好的做法容器的情況下,你可能會尋找像這樣

另一個不錯的選擇是通過簡單地使用 Lazy 類將可選依賴項設為 Lazy 對象,因此您的代碼將是Lazy<IDependency1>

使用惰性模式確保對象不會被實例化,除非您確實想訪問它們,您可以在此處閱讀更多相關信息

在 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 核心中依賴注入的最佳實踐:

https://medium.com/volosoft/asp-net-core-dependency-injection-best-practices-tips-tricks-c6e9c67f9d96

您需要在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM