Я новичок в борьбе с IoC и DI. Я хотел бы иметь возможность динамически разрешать фабрику соединений и соединений, используя автофак (или любой другой подходящий инструмент .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());