私はAutofacを使用して、enumパラメータに基づいてリアルタイムで依存関係を解決する 'generated'ファクトリを作成しようとしています。私は1つのパラメータを受け取るメソッドを持つ工場のいくつかの並べ替えを生成する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();
}
}
:
次のインタフェース/クラスを考えるとCONNECTIONTYPEをし、正しい接続を返します。オブジェクト。
私は、次の登録を開始しました:
-
を鍵付き:私はその後、別のオプションを持つTelnetConnection/SshConnection登録でプレイし続け
- メタデータ
builder.RegisterType<AutoFacConcepts.Engine.Engine>()
.As<IEngine>()
.InstancePerDependency();
builder.RegisterType<SshConnection>()
.As<IConnection>();
builder.RegisterType<TelnetConnection>()
.As<IConnection>();
正しい接続オブジェクト(ConnectionType.SshのSshConnectionとConnectionType.TelnetのTelnetConnection)を返す生成されたファクトリデリゲートを定義するための登録の正しい組み合わせが見つかりませんでした。列挙型のキーを使用してIConnection
実装を
public class Engine : IEngine
{
private IIndex<ConnectionType, IConnection> _connectionFactory;
public Engine(IIndex<ConnectionType, IConnection> connectionFactory)
{
_connectionFactory = connectionFactory;
}
public string Process(ConnectionType connectionType)
{
var connection = _connectionFactory[connectionType];
return connection.Open().ToString();
}
}
、レジスタ:あなたはPARAMTERに基づいて実装タイプを選択する必要がある場合は
このIIndexを使用する際のポイントは、この大きなスイッチケースを手作業で書くのを避けることです。このロジックはAutofacで処理することができます。長期的には、この型に複数のコンストラクタ引数がある場合、このコード全体が非常に手早くなる可能性があります。 – nemesv
OPが 'Func'の代わりに 'ConnectionFactory'デリゲートを保持したい場合、次の登録が有効です:' builder.Register ((c、p)=> { var type = ( "connectionTypeに")p.Named; スイッチ(タイプ) {ケースConnectionType.Ssh: ....} }) の.as (); '点が指定されたパラメータでありますname '' connectionType ''はデリゲート宣言のパラメータと一致します。 –
nemesv
私は確かに 'IIndex'気にしませんが、私はいつも私のコンテナとしてオートファックを保つことに熱心です! :D –