Sto provando a creare con Autofac uno factory "generato" che risolverà le dipendenze in tempo reale sulla base di un parametro enum.Autofac - Come creare un factory generato con parametri
Date le seguenti interfacce/classi:
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();
}
}
Mi piacerebbe usare Autofac per generare una sorta di fabbrica che ha un metodo che riceve un parametro: ConnectionType e restituisce il corretto collegamento oggetto.
Ho iniziato con le seguenti iscrizioni:
builder.RegisterType<AutoFacConcepts.Engine.Engine>()
.As<IEngine>()
.InstancePerDependency();
builder.RegisterType<SshConnection>()
.As<IConnection>();
builder.RegisterType<TelnetConnection>()
.As<IConnection>();
Ho poi continuato a giocare con le iscrizioni TelnetConnection/SshConnection con diverse opzioni:
- Chiamato
- con chiave
- metadati
Non sono riuscito a trovare la combinazione corretta delle registrazioni che consentirà di definire un delegato di fabbrica generato che restituirà l'oggetto di connessione corretto (SshConnection per ConnectionType.Ssh e TelnetConnection per ConnectionType.Telnet).
Il punto nell'utilizzo di' IIndex' è evitare la scrittura manuale di questi casi di switch di grandi dimensioni in modo che questa logica possa essere gestita da Autofac. Nel lungo periodo, se questo tipo ha più argomenti del costruttore, questo intero codice potrebbe diventare molto veloce. – nemesv
Se l'OP vuole mantenere il delegato 'ConnectionFactory' invece di' Func 'allora la seguente registrazione dovrebbe funzionare:' builder.Register ((c, p) => { var type = p.Named ("ConnectionType"); interruttore (tipo) { caso ConnectionType.Ssh: .... }} ) .Come (); 'il punto è il nome del parametro nome '" connectionType "' ha la corrispondenza del parametro nella dichiarazione dei delegati. –
nemesv
Certamente non mi dispiace 'IIndex', ma di nuovo sono sempre molto interessato a mantenere Autofac come contenitore! : D –