我们正在使用 ASP.NET MVC 技术开发某种云 CMS,并在此过程中发现了一些障碍。用户可以通过控制面板更改许多参数,我们需要在视图中结束这些参数。例如,用于初始化 Facebook JS API 的 Facebook 应用程序 ID。或要在页面上显示的附加文本。或背景图片。现在我们没有使用 DI 来传输这些参数,而是将它们添加到 ViewModel,但这破坏了 ASP.NET MVC 处理模型的方式(例如表单验证、绑定等)
看起来使用 DI 注入提供参数、文本和图片的服务可以使我的视图减少对特定控制器的依赖,甚至还有一些微软技术可以做到这一点http://www.asp.net/mvc/tutorials/动手实验室/aspnet-mvc-4-dependency-injection#Exercise2。但是,论坛上有很多反对使用 DI 将服务注入视图的答案。
所以问题是:将一些服务注入视图的正确方法是什么?或者我根本不应该这样做并且应用程序设计有问题?
更新:一些真实的代码示例(现在我们使用模型来注入服务)
从数据库中注入文本(它们必须是用户可编辑的,因为它是 CMS):
<div class="steps">@Html.Raw(Model.Texts["Main", "Step2"]</div>
从数据库中注入翻译(实际上是本地化):
<div class="gonfalon">@Model.Translations["Title_Winners"]</div>
注入参数(来自数据库,可能是特定于请求的;例如,如果站点具有不同的域,则 facebook 应用程序应该是每个域的):
Facebook.Initialize(Model.Parameters["FbApplicationId"], Model.Parameters["FbApplicationSecret"]);
当前方法的问题是该代码取自竞赛机制。处理自定义文本、翻译或 facebook 应用程序 ID 绝对超出竞争业务范围。它还破坏了模型,因为模型模型不是实际的业务领域,而是处理很多实际上属于视图的东西(比如翻译和自定义文本)
更新 2:已将以下答案中的代码段修改为更通用:
public static class WebViewPageExtensions
{
public static I ResolveService<I>(this WebViewPage page)
{
return DependencyResolver.Current.GetService<I>();
}
}