Таких конструкций следует избегать, когда это возможно.Поэтому спросите себя: действительно ли этот параметр требуется в качестве аргумента конструктора?Или можно заменить SomeObject на объект без состояния, который используется всеми, кто зависит от него, путем передачи параметра методу, который вы выполняете для объекта?
например, вместо
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;
}
}
use
public class SomeObject
{
public SomeObject(IService service)
{
}
public float Do(float x, float someValue)
{
return this.Service.Get(someValue) * x;
}
}
Если требуется, перейдите на завод:
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);
}
}
Предварительный просмотр: Ninject 2.4 больше не будет требовать реализации, но разрешит
kernel.Bind<ISomeObjectFactory>().ToFactory(); // or maybe .AsFactory();