Я пытаюсь создать с помощью Autofac «сгенерированную» фабрику, которая будет разрешать зависимости в режиме реального времени на основе параметра enum.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 с различными вариантами:
- Названный
- шпоночным
- Метаданные
Я не смог найти правильную комбинацию регистраций, которая позволит мне определить сгенерированный делегат фабрики, который вернет правильный объект соединения (SshConnection для ConnectionType.Ssh и TelnetConnection для ConnectionType.Telnet).
Точка использования' IIndex' заключается в том, чтобы избежать ручной записи этих больших корпусов коммутаторов, чтобы эта логика могла обрабатываться Autofac. В конечном счете, если у этих типов есть несколько аргументов конструктора, весь этот код может быть довольно запутанным. – nemesv
Если OP хочет сохранить делегат 'ConnectionFactory' вместо' Func ', то следующая работа должна работать: 'builder.Register ((c, p) => { var type = p.Named ("ConnectionType"); переключатель (тип) { случай ConnectionType.Ssh: .... }} ) .Как (); 'точка является именованный параметр name '" connectionType "' соответствует параметру в объявлении делегата. –
nemesv
Я, конечно, не против 'IIndex', но опять же я всегда очень люблю держать Autofac в качестве контейнера! : D –