Mark Seeman lo hizo bien. Y simpatizo con tu confusión. Lo revisé yo mismo cuando aprendí a usar contenedores automáticos de inyección de dependencia. El problema es que hay muchas formas válidas y razonables de diseñar y usar objetos. Sin embargo, solo algunos de estos enfoques funcionan con contenedores de inyección de dependencia automática.
Mi historia personal: Aprendí principios de OO de construcción de objetos e Inversión de control mucho antes de aprender a usar contenedores de Inversión de Control como los contenedores de Unity o Castle Windsor. Adquirí el hábito de escribir código como este:
public class Foo
{
IService _service;
int _accountNumber;
public Foo(IService service, int accountNumber)
{
_service = service;
_accountNumber = accountNumber;
}
public void SaveAccount()
{
_service.Save(_accountNumber);
}
}
public class Program
{
public static void Main()
{
Foo foo = new Foo(new Service(),1234);
foo.Save();
}
}
En este diseño, mi clase Foo es responsable de las cuentas de ahorro a la base de datos. Necesita un número de cuenta para hacer eso y un servicio para hacer el trabajo sucio. Esto es algo similar a las clases concreted que proporcionó anteriormente, donde cada objeto toma algunos valores únicos en el constructor. Esto funciona bien cuando instancia los objetos con su propio código. Puede pasar los valores apropiados en el momento correcto.
Sin embargo, cuando supe sobre los contenedores automáticos de inyección de dependencia, descubrí que ya no estaba instanciando manualmente Foo. El contenedor crearía una instancia de los argumentos del constructor para mí. Esto fue una gran conveniencia para los servicios como IService. Pero obviamente no funciona tan bien para enteros y cadenas y cosas por el estilo. En esos casos, proporcionaría un valor predeterminado (como cero para un entero).En cambio, me había acostumbrado a pasar en los valores específicos del contexto como el número de cuenta, nombre, etc ... así que tuve que ajustar mi estilo de codificación y diseño que ser así:
public class Foo
{
IService _service;
public Foo(IService service)
{
_service = service;
}
public void SaveAccount(int accountNumber)
{
_service.Save(accountNumber);
}
}
public class Program
{
public static void Main()
{
Foo foo = new Foo(new Service());
foo.Save(1234);
}
}
Parece que tanto Las clases de Foo son diseños válidos. Pero el segundo es utilizable con inyección de dependencia automática, y el primero no.
¿cómo sería posible almacenar estos en el archivo de configuración en lugar de la codificación? –