簡體   English   中英

C#Simple Injector返回動態接口類型

[英]C# Simple Injector return dynamic Interface type

我創建了兩個名為Provider1和Provider2的數據提供程序類,它們都實現了IProvider接口。 這個想法是,提供者實例將根據某些條件而有所不同,因此我創建了一個方法以返回該接口的特定實現:

public IProvider GetProvider()
{
    if(*logic*)
    {
        return new Provider1();
    }
    else 
    {
        return new Provider2();
    }
}

問題在於,兩個提供者都具有通過SimpleInjector實例化的對象,而我不想返回以下內容:

return new Provider1(new Object1(), new Object2());

這是使用構造函數注入和接口的提供程序的示例:

public interface IProvider
{
    public object GetData();
}


public class Provider1 : IProvider
{
    private Object1 _object1;
    private Object2 _object2;

    public Provider1(Object1 object1, object2 object2)
    {
        _object1 = object1; 
        _object2 = object2;
    }

    public object GetData()
    {
         *Provider1 specific logic*
    }
}

Provider2看起來與Provider1類似,但是它包含不同的邏輯,因為它是不同的Provider。 我最初嘗試的是:

return Activator.CreateInstance<Provider1>();

但這會引發一個異常,指出“沒有為此對象定義無參數構造函數”。 所以我的問題是:在使用SimpleInjector時,如何從期望返回IProvider的方法中返回Provider1或Provider2的實例? 我可以在運行時使用這種類型注冊現有容器嗎? 我希望能夠從“客戶端”中調用類似的內容,而無需客戶端關心數據的來源:

private IProvider _provider;
return _provider.GetData();

謝謝!

您需要一個提供程序工廠,您可以在SimpleInjector中進行注冊。

interface IProviderFactory
{
    IProvider GetProvider();
}

class ProviderFactory : IProviderFactory
{
    private readonly Object1 _object1;
    private readonly Object2 _object2;

    public ProviderFactory(Object1 object1, Object2 object2)
    {
        _object1 = object1; //injected
        _object2 = object2; //injected
    }

    public IProvider GetProvider()
    {
        if (*logic*)
        {
            return new Provider1(_object1, _object2);
        }
        else
        {
            return new Provider2(_object1, _object2);
        }
    }
}

然后在您的合成根目錄中:

container.Register<IProviderFactory, ProviderFactory>();
container.Register<Object1, Object1>();
container.Register<Object2, Object2>();

然后,您將工廠注入任何需要獲取提供程序實例的類中,然后將其稱為工廠。 工廠將使用SimpleInjector提供的依賴項,並將其傳遞給提供程序。

class Example
{
    private readonly IProviderFactory _providerFactory;

    public Example(IProviderFactory providerFactory)
    {
        _providerFactory = providerFactory;  //Injected
    }

    public void MainCode()
    {
        IProvider p = _providerFactory.GetProvider();
        var foo = p.GetDate();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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