使用控制反转来构造与调用者的依赖关系

Use Inversion of Control to construct dependency with caller

给出以下 ASP.NET 核心控制器:

public class MyController : Controller {
    public MyController(IDependency dependency) { this.dependency = dependency; }
}

public interface IDependency;

public class DependencyImplementation : IDependency {
    public DependencyImplementation(Controller controller) { ... }
}

我希望 MyController 注入一个 DependencyImplementation 的新实例,用它被传递到的控制器构造。理想情况下使用 Ninject.

非 IoC 版本为:

public class MyController : Controller {
    public MyController() { this.dependency = new DependencyImplementation(this); }
}

这会导致循环依赖。我唯一的想法是介绍工厂:

public interface IDependencyFactory
{
    IDependency Create(Controller controller);
}

public class MyController : Controller
{
    private IDependency dependency;

    public MyController(IDependencyFactory dependencyFactory)
    {
        this.dependency = dependencyFactory.Create(this);
    }
}

var kernel = new StandardKernel();
kernel.Bind<Controller>().To<MyController>();
kernel.Bind<IDependency>().To<DependencyImplementation>();
kernel.Bind<IDependencyFactory>().ToFactory();
var controller = kernel.Get<Controller>();

或者重新考虑整个设计。