[英]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.