属性 注入无效
Property injection not working
我有两个 类,它们相互依赖。显然,当我按以下方式使用 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;
}
}
而相反的方式,当我用 属性 注入第二个时,用构造函数注入第一个。它们都导致循环依赖。第三种方式,当我在两者中使用 属性 注入时,会导致 Whosebug 异常。这种注入的实现方式是什么?请记住,这两个都是服务 类.
绑定:
/// <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 和 Class2 时使用其他 Object Scopes 而不是默认的 (InTransientScope()
)。
像这样的东西(例如我在这里使用单例范围):
kernel.Bind<IClass1>().To<Class1>().InSingletonScope();
kernel.Bind<IClass2>().To<Class2>().InSingletonScope();
此外,我认为只有当您对两个 类 都使用 属性 注入并且不仅在其中一个中使用时,它才会起作用,您应该尝试这两个选项。
作为旁注,我确实认为循环依赖是一个很大的暗示,表明您在设计中遗漏了一些东西,您应该考虑重新设计这些 类。
我有两个 类,它们相互依赖。显然,当我按以下方式使用 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;
}
}
而相反的方式,当我用 属性 注入第二个时,用构造函数注入第一个。它们都导致循环依赖。第三种方式,当我在两者中使用 属性 注入时,会导致 Whosebug 异常。这种注入的实现方式是什么?请记住,这两个都是服务 类.
绑定:
/// <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 和 Class2 时使用其他 Object Scopes 而不是默认的 (InTransientScope()
)。
像这样的东西(例如我在这里使用单例范围):
kernel.Bind<IClass1>().To<Class1>().InSingletonScope();
kernel.Bind<IClass2>().To<Class2>().InSingletonScope();
此外,我认为只有当您对两个 类 都使用 属性 注入并且不仅在其中一个中使用时,它才会起作用,您应该尝试这两个选项。
作为旁注,我确实认为循环依赖是一个很大的暗示,表明您在设计中遗漏了一些东西,您应该考虑重新设计这些 类。