【问题标题】:How do I bind a class which takes its parent class in the constructor with Ninject?如何使用 Ninject 绑定在构造函数中采用其父类的类?
【发布时间】:2013-10-08 16:57:00
【问题描述】:

我有这样的课:

public class MyClass
{
    public MyClass()
    {
        this.Dependency = new Dependency(this);
    }
}

我想将new Dependency() 调用移至构造函数。

public class MyClass
{
    public MyClass(IDependency dependency)
    {
        this.Dependency = dependency;
    }
}

我不知道如何绑定它,以便使用 'this' 构造函数参数创建 IDependency

Bind<IDependency>()
  .To<Dependency>()
    .WithConstructorArgument("myClass", ctx => ctx.???); // How do I do this?

【问题讨论】:

  • 你不能传递'this',因为在创建参数时'this'不存在。您只能在手动情况下摆脱它,因为您在构造函数本身内部创建它,此时已经创建了“this”。一般来说,这种循环引用是一种“代码味道”(至少当 Dependency 是公共类时),因此您可能需要考虑是否可以重构它,以便 MyClass 和 Dependency 都依赖于具有必要的共享功能。
  • 你有没有为此找到解决方案?
  • 并非如此。我正在重构一个现有的大型项目,并且一次解决一个问题。但我还不清楚这个最好的方法。一个更现实的例子是Contact,它有一个ContactAddress 依赖项(当前在构造函数中实例化),但地址有依赖项,所以我想解决它。我可以移动ContactAddress 以使用属性注入而不是构造函数注入,但我仍然不清楚要使用的绑定。

标签: c# ninject


【解决方案1】:

您的示例的布局方式,我认为您有这种缺点。 MyClass 依赖于 IDependency,所以我希望你这样做:

Bind<IMyClass>().To<MyClass>().WithConstructorArgument("dependency", new Dependency());

【讨论】:

  • 我发现我面临循环引用的危险。但是我现有的Dependency 类在其构造函数中采用MyClass 参数。如果我想让 Ninject 处理它,我该如何进行?我可以将它移动到一个属性并使用属性注入,但我仍然看不到如何将this 注入到构造函数中。
  • 啊,我没有在你的原始帖子中看到这一点。或许您可以去掉Dependency 的构造函数中的MyClass 参数,并将引用设置为MyClass 的构造函数中的属性? (例如dependency.Parent = this;)。不过,听起来您的类非常紧密耦合,这可能只是为糟糕的类布局提供了一个创可贴。
猜你喜欢
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 2019-10-26
  • 1970-01-01
  • 1970-01-01
  • 2018-02-28
  • 1970-01-01
相关资源
最近更新 更多