【问题标题】:Property injection not working属性注入不起作用
【发布时间】:2016-10-21 08:29:47
【问题描述】:

我有两个相互依赖的类。显然,当我以下列方式使用 ninject 时:

public Class Class1()
{
  private readonly class2;
  public Class1(IClass2 class2)
  {
    this.class2 = class2;
  }
}

public Class Class2()
{
  private readonly class1;
  public Class1(IClass1 class1)
  {
    this.class1 = class1;
  }
}

导致循环依赖。

我知道解决这个问题的方法是属性注入。但我试过这个:

public Class Class1()
{
  private readonly class2;
  public Class1()
  {
  }
  [Inject]
  IClass2 Class2
  {
   get { return this.class2; }
   set { this.class2 = value; }
  }
}

结合这个:

public Class Class2()
{
  private readonly class1;
  public Class1(IClass1 class1)
  {
    this.class1 = class1;
  }
}

反过来,当我在第二个中注入属性时,在第一个中注入构造函数。它们都导致循环依赖。第三种方式,当我在它们中使用属性注入时,会导致 StackOverflow 异常。实现这种注入的方法是什么?请记住,这两个都是服务类。

绑定:

/// <summary>
        /// Creates the kernel that will manage your application.
        /// </summary>
        /// <returns>The created kernel.</returns>
        private static IKernel CreateKernel()
        {
            var kernel = new StandardKernel();
            try
            {
                kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
                kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

                RegisterServices(kernel);
                return kernel;
            }
            catch
            {
                kernel.Dispose();
                throw;
            }
        }

        /// <summary>
        /// Load your modules or register your services here!
        /// </summary>
        /// <param name="kernel">The kernel.</param>
        private static void RegisterServices(IKernel kernel)
        {
            kernel.Bind(b => b
            .From(Assemblies.ProjectServices) // link to the services there
            .SelectAllClasses()
            .BindDefaultInterface());
        } 

【问题讨论】:

  • 属性注入应该解决循环依赖,能告诉我们哪里抛出的异常吗?
  • 我有一个控制器,我在其中注入 Class1(这取决于它)。当我尝试初始化时,它会引发异常。
  • 你能告诉我们ninject内核绑定吗?
  • 有问题。

标签: c# asp.net .net ninject


【解决方案1】:

我认为您在注册 Class1 和 Class2 时可以尝试使用其他 Object Scopes 而不是默认的 (InTransientScope())。

像这样的东西(例如,我在这里使用了单例范围):

 kernel.Bind<IClass1>().To<Class1>().InSingletonScope();
 kernel.Bind<IClass2>().To<Class2>().InSingletonScope();

此外,我认为只有在对两个类都使用属性注入并且不仅在其中一个类中使用属​​性注入时,它才会起作用,你应该尝试两种选择。

作为旁注,我确实认为循环依赖是一个很大的暗示,表明你在设计中遗漏了一些东西,你应该考虑重新设计这些类。

【讨论】:

  • 您是否尝试过使用单例范围,如果实际程序无法使用单例实例,但需要一个唯一的对象怎么办
  • @MrinalKamboj 我不明白问题是什么,您可以从现有的范围中选择满足您需求的范围,如果没有,您可以创建自定义范围,单例范围仅用于示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
  • 2017-10-10
  • 1970-01-01
  • 1970-01-01
  • 2021-04-17
  • 2015-11-18
  • 2012-04-23
相关资源
最近更新 更多