Según los principios SOLIDOS, una clase no puede depender de otras clases, las dependencias deben ser inyectadas. Es muy sencillo:Inversión de dependencia. Creación de objetos
class Foo
{
public Foo(IBar bar)
{
this.bar = bar;
}
private IBar bar;
}
interface IBar
{
}
class Bar: IBar
{
}
Pero lo que si quiero que mi clase Foo sea capaz de crear barra de, sin conocer la aplicación exacta detrás IBar? me ocurre 4 soluciones aquí, pero todos ellos parecen tener inconvenientes:
- inyectables del tipo de objeto y que utilizan la reflexión
- utilizando los genéricos
- el uso de "Servicio de localización" y llamando a la Resolve () método.
- la creación de una clase de fábrica separados e inyectarlo en Foo:
class Foo
{
public void DoSmth(IBarCreator barCreator)
{
var newBar = barCreator.CreateBar();
}
}
interface IBarCreator
{
IBar CreateBar();
}
class BarCreator : IBarCreator
{
public IBar CreateBar()
{
return new Bar();
}
}
último caso parece natural, pero la clase BarCreator tiene código demasiado Litle. Entonces, ¿cómo crees que es mejor?
La opción 4 es la respuesta correcta: http://stackoverflow.com/questions/1943576/is-there-a-pattern-for-initializing-objects-created-via-a-di-container/1945023#1945023 –
Sin embargo, ¿por qué quieres que Foo cree el IBar? Sé consciente de las abstracciones fugaces. –