gpt4 book ai didi

.net - 如何在 MVC3 中使用 Ninject 将服务注入(inject) View / View 模型?

转载 作者:行者123 更新时间:2023-12-01 13:00:00 29 4
gpt4 key购买 nike

我将 MVC3 与 Ninject 一起使用,我的 Controller 中的依赖项已毫无问题地得到解决。我几乎没有像本地化、格式提供程序这样的服务,我希望将它们注入(inject) View 模型或 Razor View 。现在我正在手动将它们注入(inject)我的 View 模型,

  1. 我怎样才能使它自动化?
  2. 我可以向 Razor View 注入(inject)一些服务吗?
  3. 如何在 MVC 中使用 Ninject 设置服务定位器?

对于其他人:Service Locator 似乎不是个好主意,因为 Ninjects Bootstrapper.Kernel 已经过时,而 Service Locator 是一种反模式。看看这篇文章 http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx

_

public class HomeController : Controller
{
//This gets injected correctly
[Inject]
public ILocalizationService LocalizationService { get; set; }

//This gets injected correctly
[Inject]
public MyModel Model { get; set; }

public ActionResult Index()
{
var modelResult = Model.GetStuff();
//Here I am manully injecting my services to my View Model,
//I would like Ninject to inject services into my view model.
var viewModelResult = IndexViewModel.Covert(LocalizationService, modelResult);
return View(viewModelResult);
}


public ActionResult About()
{
return View();
}
}

最佳答案

如果您使用的是 Ninject 的 MVC 3 插件,那么创建所有可用的 Hook 非常有用。我认为支持 Razor View :如果您创建一个类来扩展典型的 View 类并向该类添加注入(inject)的依赖项,我认为 Ninject 将能够注入(inject)这些项目以便它们可用在 View 中给你。

就我的观点而言,我更喜欢使用自定义的基于 HtmlHelper 的扩展方法,这些方法最终间接使用基于单例的服务定位器模式来访问适当的依赖项。如果您发现说 Html.MyMethod(...)Url.MyMethod(...) 或类似的东西没有意义,您尝试包含的项目很可能不属于您的 View 。

同样,模型对象通常应该只是 POCO,与它们关联的逻辑最少。用服务填充它们听起来像是违反了 MVC 模型。正如 Jason 指出的那样,您可以从 Controller 的代码中在模型上设置格式提供程序。但是,我认为使用格式提供程序生成您需要的字符串并将 those 放在模型上会更好。

对 Jason 帖子评论的回应

方法 1 听起来是个好主意,因为听起来您的 Controller 变得越来越复杂,这是将关注点分离到不同类中的好地方。如果您将 Converter 本身注入(inject)到您的 Controller 中,而不是将其用作静态类,那么当 Ninject 创建 Controller 时,它的依赖项将自动注入(inject)。

public class HomeController : Controller
{
[Inject]
public ViewModelConverter Converter { get; set; }

[Inject]
public MyModel Model { get; set; }

public ActionResult Index()
{
var modelResult = Model.GetStuff();
var viewModelResult = Converter.MakeViewModel(modelResult);
return View(viewModelResult);
}


public ActionResult About()
{
return View();
}
}

public class ViewModelConverter
{
[Inject]
public ILocalizationService LocalizationService { get; set; }

public ViewModel MakeViewModel(MyModel model)
{
// You should be able to use LocalizationService here
}
}

尽管我个人更喜欢使用构造函数注入(inject),但我坚持使用基于属性的注入(inject)。

关于.net - 如何在 MVC3 中使用 Ninject 将服务注入(inject) View / View 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6998156/

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