给定以下 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>();
或者更确切地说,重新考虑整个设计。