使用控制反转来构造与调用者的依赖关系
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>();
或者重新考虑整个设计。
给出以下 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>();
或者重新考虑整个设计。