gpt4 book ai didi

asp.net-mvc - 将依赖项注入(inject)自定义模型绑定(bind)器并使用 InRequestScope 使用 Ninject

转载 作者:行者123 更新时间:2023-12-04 01:28:25 26 4
gpt4 key购买 nike

我将 NInject 与 NInject.Web.Mvc 一起使用。

首先,我创建了一个简单的测试项目,我想要一个 IPostRepository 的实例。在同一 Web 请求期间在 Controller 和自定义模型绑定(bind)器之间共享。在我的实际项目中,我需要这个,因为我得到 IEntityChangeTracker我实际上有两个存储库访问同一个对象图的问题。所以为了让我的测试项目简单,我只是想共享一个虚拟存储库。

我遇到的问题是它适用于第一个请求,仅此而已。相关代码如下。

NInject 模块:

public class PostRepositoryModule : NinjectModule
{
public override void Load()
{
this.Bind<IPostRepository>().To<PostRepository>().InRequestScope();
}
}

自定义模型绑定(bind)器:
public class CustomModelBinder : DefaultModelBinder
{
[Inject]
public IPostRepository repository { get; set; }

public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
repository.Add("Model binder...");

return base.BindModel(controllerContext, bindingContext);
}
}

public class HomeController : Controller
{
private IPostRepository repository;

public HomeController(IPostRepository repository)
{
this.repository = repository;
}

public ActionResult Index(string whatever)
{
repository.Add("Action...");

return View(repository.GetList());
}
}

全局.asax:
protected override void OnApplicationStarted()
{
AreaRegistration.RegisterAllAreas();

RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);

ModelBinders.Binders.Add(typeof(string), kernel.Get<CustomModelBinder>());
}

这样做实际上是创建了两个独立的 IPostRepository 实例。而不是共享实例。关于将依赖项注入(inject)我的模型绑定(bind)器,我在这里缺少一些东西。我上面的代码是基于 NInject.Web.Mvc wiki 中描述的第一种设置方法。但我都试过了。

当我使用第二种方法时, IPostRepository只会在第一个 Web 请求时共享,之后默认不共享实例。然而,当我真正开始工作时,我使用的是默认的 DependencyResolver因为我一生都无法弄清楚如何对 NInject 做同样的事情(因为内核隐藏在 NInjectMVC3 类中)。我是这样做的:
ModelBinders.Binders.Add(typeof(string),
DependencyResolver.Current.GetService<CustomModelBinder>());

我怀疑这只是第一次起作用的原因是因为这不是通过 NInject 解决它,所以生命周期实际上是由 MVC 直接处理的(尽管这意味着我不知道它是如何解决依赖关系的)。

那么我该如何正确注册我的模型绑定(bind)器并让 NInject 注入(inject)依赖项呢?

最佳答案

MVC 为多个请求重用 ModelBinders。这意味着它们的生命周期比请求范围更长,因此不允许依赖具有较短请求范围生命周期的对象。

使用 Factory而是为 BindModel 的每次执行创建 IPostRepository

关于asp.net-mvc - 将依赖项注入(inject)自定义模型绑定(bind)器并使用 InRequestScope 使用 Ninject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9186560/

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