gpt4 book ai didi

asp.net-mvc-2 - 使用 Ninject 2 在基本 Controller 中进行属性注入(inject)

转载 作者:行者123 更新时间:2023-12-04 19:21:22 25 4
gpt4 key购买 nike

我的 Global.aspx 中有以下代码

protected override void OnApplicationStarted()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
RegisterAllControllersIn(Assembly.GetExecutingAssembly());
}

protected override IKernel CreateKernel()
{
return new StandardKernel(new ServiceModule());
}

我还有以下忍者模块:
internal class ServiceModule : NinjectModule
{
public override void Load()
{
Bind<IProductService>().To<ProductService>().InRequestScope();
}
}

我还有一个基本 Controller :
public class BaseController : Controller
{
[Inject]
public IProductService ProductService
{
get;
set;
}
}

此代码有效。我遇到的问题是我想从基本 Controller 中删除注入(inject)属性并在 Ninject ServiceModule 中指定它。换句话说,我将如何在 ServiceModule 中编写一个绑定(bind)规则,告诉 Ninject 将 ProductService 注入(inject)基本 Controller 的属性中?

如果我删除该属性,我将得到一个 NullReferenceException。

最佳答案

基于约定的绑定(bind)存在于 http://github.com/ninject/ninject.extensions.conventions -- 一个实现IBindingGenerator .不过,这主要与发现接口(interface)和服务有关。

一般来说,构造函数注入(inject)是一种很好的默认方法。然而,ASP.NET MVC 的工作方式使得这更难做到(因此 FubuMVC 等)。所以属性注入(inject)是下一个最佳选择。

您可能会发现使用 OnActivation在您的 Bind可能会让你做的足够多——如果可以的话,这是迄今为止最简单的。

我会将您尝试做的事情描述为基于约定的激活。问题是:

  • 决定要自动注入(inject)的内容。你要注入(inject)所有不具体的公开内容吗?你的内核知道的一切?除非你能对你想要做的事情提出一个清晰的定义,否则注入(inject)过程可能会变得不可预测且难以理解。你最终要调试并向同事解释很多。
  • 使其高效。 Ninject 在幕后动态生成代码以使实例的激活有效(即,在遍历类时寻找 [Inject] 标记它生成一次代码来执行该操作,然后就像你用手写一样编写它)。

  • 查看代码,没有简单的 OOTB 方法。看起来像添加自定义 IInjectionHeuristic会成功的。

    但是,如果您要深入到容器中,则需要
  • 停下来看看你是否可以通过不走这条路来保持简单
  • 去ninject邮件列表搜索类似的东西
  • 如果您仍然想这样做,请在那里发送邮件。
  • 关于asp.net-mvc-2 - 使用 Ninject 2 在基本 Controller 中进行属性注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3154240/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com