Ninject Convention基于不同的生活方式

时间:2014-04-19 14:46:04

标签: c# ninject ninject-extensions

我正在尝试使用Ninject 3基于约定的绑定,并希望指定服务应该在绑定时绑定哪种生活方式。

我正在尝试使用下面的代码,但没有成功;我的应用程序错误说我的服务没有受到约束。我知道我可以编写自己的活页夹并自己完成所有的反射工作,但这看起来相当不错。我错过了什么吗?

Kernel.Bind(x => x.FromAssembliesMatching("PatentSpoiler*")
      .SelectAllClasses()
      .BindDefaultInterface()
      .Configure(cfg =>
       {
          cfg.InTransientScope();
          cfg.WhenClassHas<BindAsASingletonAttribute>().InSingletonScope();
          cfg.WhenClassHas<BindInRequestScopeAttribute>().InRequestScope();
       }));

谢谢,

乔恩

1 个答案:

答案 0 :(得分:1)

Configure回调中,您正在组合一个用于所有绑定的配置,当您编写多个WhenClassHasIn...Scope语句时,您基本上会覆盖自己的设置,所以类型绑定将使用最后一个语句cfg.WhenClassHas<BindInRequestScopeAttribute>().InRequestScope();

要解决这个问题,你需要使用Configure的第二个重载来获取当前绑定的类型,并根据其属性在正确的范围内注册你的类型:

using Ninject.Infrastructure.Language; //needed for HasAttribute<T>

//...

Kernel.Bind(x => x.FromAssembliesMatching("PatentSpoiler*")
      .SelectAllClasses()
      .BindDefaultInterface()
      .Configure((cfg, type) =>
      {
          if (type.HasAttribute<BindAsASingletonAttribute>())
              cfg.InSingletonScope();
          else if (type.HasAttribute<BindInRequestScopeAttribute>())
              cfg.InRequestScope();
          else
              cfg.InTransientScope();
      }));