Dichas construcciones deben evitarse siempre que sea posible. Por lo tanto, pregúntate: ¿este parámetro es realmente necesario como argumento de constructor? ¿O puede SomeObject ser reemplazado por uno sin estado que es reutilizado por todos los que dependen de él pasando el parámetro al método que ejecuta en el objeto?
p. Ej.En lugar de
public class SomeObject
{
private float someValue
public SomeObject(IService service, float someValue)
{
this.someValue = someValue
}
public float Do(float x)
{
return this.Service.Get(this.someValue) * x;
}
}
uso
public class SomeObject
{
public SomeObject(IService service)
{
}
public float Do(float x, float someValue)
{
return this.Service.Get(someValue) * x;
}
}
Si es necesario ir a una fábrica:
public interface ISomeObjectFactory
{
ISomeObject CreateSomeObject(float someValue);
}
public class SomeObjectFactory : ISomeObjectFactory
{
private IKernel kernel;
public SomeObjectFactory(IKernel kernel)
{
this.Kernel = kernel;
}
public ISomeObject Create(float someValue)
{
return this.kernel.Get<ISomeObject>(WithConstructorArgument("someValue", someValue);
}
}
Vista previa: Ninject 2.4 no requerirá de la implementación más, pero permitirá
kernel.Bind<ISomeObjectFactory>().ToFactory(); // or maybe .AsFactory();
Por parámetros de constructor manual, ¿quiere decir cuando está construyendo manualmente la clase en lugar de DI o quiere decir que el contenedor DI pasa en un parámetro? Si es el primero, ¿podrías hacer una sobrecarga de constructor? – lahsrah
En cualquier caso, siempre necesito IService, así que supongo que no podría hacer una sobrecarga, sin las dependencias y mágicamente usa el constructor completo (a menos que use ServiceLocator - ¡asco!). –