Soy un principiante que lucha con IoC y DI. Me gustaría poder resolver la conexión y la fábrica de conexión de forma dinámica utilizando autofac (o cualquier otra herramienta .oC IOC adecuada).IoC, fábricas y argumentos de constructor
Un escenario podría cambiar la aplicación de conexión a otro con más instalaciones para el rastreo etc.
Cuando aplico DI y de la COI para el código de abajo, aparece un lío de namedParameter en los constructores etc. La fábrica de conexiones devuelve una nueva conexión con un puerto único (ejemplo tonto, solo para mostrar que necesito mantener algún tipo de estado en la fábrica)
Me imagino que podría usar inyección de propiedad para el rango de IP y puerto, pero de esa manera, no se garantiza que las conexiones tengan una IP o puerto, que es el punto de un constructor. Además, los parámetros nombrados también me hacen depender de los nombres de los argumentos.
Ideas, patrones, punteros IoC son muy apreciados!
Actualización:
más específica: ¿Cómo podría cambiar la clase de conexión que se inyectable? ¿Debería ir con la inyección de propiedad? ¿O algún truco que podría hacer para obtener una resolución más segura de tipos con argumentos de constructor?
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++);
}
}
Ahora, el uso:
//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());
Quizás desee aclarar su pregunta/problema real con el código anterior o si está buscando enlaces/muestras de documentación para un marco de trabajo de IoC específico. – Reddog
Gracias por el comentario, ¡he tratado de ser más específico! – Larsbj
Me gustaría continuar con la inyección de propiedad y primero resolver el obect y luego pasar las propiedades. – sajoshi