IoC, фабрики и аргументы конструктора

Я новичок борюсь с IoC и DI. Я хотел бы иметь возможность динамически разрешать соединение и фабрику соединений с помощью autofac (или любого другого подходящего инструмента .NET IoC).

Сценарий может заключаться в изменении реализации соединения на другую с большим количеством возможностей для трассировки и т. Д.

Когда я применяю DI и IoC к приведенному ниже коду, я получаю беспорядок с namedParameter в конструкторах и т. Д. Фабрика соединений возвращает новое соединение с уникальным портом (глупый пример, просто чтобы показать, что мне нужно поддерживать какое-то состояние на фабрике)

Я полагаю, что мог бы использовать инъекцию свойств для IP и диапазона портов, но в этом случае я бы не стал быть гарантированным, что соединения будут иметь IP или порт, который является точкой конструктора. Кроме того, именованные параметры также делают меня зависимым от имен аргументов.

Идеи, шаблоны, указатели IoC очень ценятся!

Обновление:

Более конкретно: как я могу изменить класс подключения на инъекционный? Стоит ли мне использовать инъекцию свойств? Или какие-нибудь уловки, которые я мог бы сделать для более безопасного разрешения типов с аргументами конструктора?

public interface IConnection {
     void Open();
     void Close();
     string Execute(string command);
}

public interface IConnectionFactory {
     IConnection CreateConnection();
}

public class Connection : IConnection {
   ...
   public Connection(String ip, int port) {
     _ip = ip;
     _port = port;
   }

   public string Execute() {}   
   public void Open() {}
   public void Close() {}
}


public class ConnectionFactory : IConnectionFactory {
    //How would I resolve this?
    public ConnectionFactory(string ip, int fromPort) {
        ...
    }
    public IConnection CreateConnection()  {
        //How would I resolve this? 
        return new Connection(ip, fromPort++);
    }
}

Теперь, использование:

//Register
builder.RegisterType<Connection>().As<IConnection>();
builder.RegisterType<ConnectionFactory>().As<IConnectionFactory>().SingleInstance();
...

var connection = container.Resolve<IConnectionFactory>(
      new NamedParameter("ip", "127.0.0.1"), 
      new NamedParameter("fromPort", 80).CreateConnection());
6
задан Larsbj 2 March 2011 в 00:41
поделиться