【问题标题】:Use Inversion of Control to construct dependency with caller使用控制反转与调用者构建依赖关系
【发布时间】:2017-11-15 17:56:44
【问题描述】:

给定以下 ASP.NET Core 控制器:

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); }
}

【问题讨论】:

  • 您的代码会导致依赖循环。依赖循环是不好的,通常应该避免。所以请解释为什么您需要将Controller 注入到依赖项中。最好使用一些代码。
  • 我认为Dependency Injection 书为此类情况提供了解决方案,但使用了this hack。

标签: c# asp.net-core .net-core ninject


【解决方案1】:

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

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>();

或者也许宁愿重新考虑整个设计。

【讨论】:

  • “或者更确切地说,重新考虑整个设计。”就是这样:-)
猜你喜欢
  • 2011-03-14
  • 1970-01-01
  • 2010-11-02
  • 2015-07-30
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多