我試圖與Autofac創建一個「生成」的工廠,將在基於一個枚舉參數的實時解決依賴關係生成的工廠。Autofac - 如何創建具有參數
考慮下面的接口/類:
public delegate IConnection ConnectionFactory(ConnectionType connectionType);
public enum ConnectionType
{
Telnet,
Ssh
}
public interface IConnection
{
bool Open();
}
public class SshConnection : ConnectionBase, IConnection
{
public bool Open()
{
return false;
}
}
public class TelnetConnection : ConnectionBase, IConnection
{
public bool Open()
{
return true;
}
}
public interface IEngine
{
string Process(ConnectionType connectionType);
}
public class Engine : IEngine
{
private ConnectionFactory _connectionFactory;
public Engine(ConnectionFactory connectionFactory)
{
_connectionFactory = connectionFactory;
}
public string Process(ConnectionType connectionType)
{
var connection = _connectionFactory(connectionType);
return connection.Open().ToString();
}
}
我想使用Autofac產生一些工廠有接收一個參數的方法:ConnectionType並返回正確的連接目的。
我開始用下面的註冊:
builder.RegisterType<AutoFacConcepts.Engine.Engine>()
.As<IEngine>()
.InstancePerDependency();
builder.RegisterType<SshConnection>()
.As<IConnection>();
builder.RegisterType<TelnetConnection>()
.As<IConnection>();
我再繼續TelnetConnection的/ SshConnection註冊有不同的選擇玩:
- 命名
- 鍵控
- 元數據
我無法找到正確的註冊組合,這將允許我定義一個生成的工廠委託,它將返回正確的連接對象(用於ConnectionType.Sh的SshConnection和用於ConnectionType.Telnet的TelnetConnection)。
使用'IIndex'的目的是爲了避免手動編寫這個大開關的情況,所以這個邏輯可以由Autofac處理。從長遠來看,如果這種類型有多個構造函數參數,這整個代碼可能會很快變得混亂。 – nemesv
如果OP想要保留'ConnectionFactory'委託而不是'Func',那麼下面的註冊應該可以工作:'builder.Register ((c,p)=> var type = p.Named ( 「connectionType」); 開關(類型) { 情況ConnectionType.Ssh: .... } }) 。作爲();'點在命名參數name'「connectionType」'與委託聲明中的參數匹配。 –
nemesv
我當然不介意'IIndex',但是我總是非常熱衷於保持Autofac作爲我的容器! :D –