[英]IoC and ASP.NET MVC Views
有沒有一種好方法可以讓我的 IoC 解決對視圖的依賴? 我有自己的基於 Castle Windsor 的 IoC 解析器。 我有一個IResourceService
,我想在我的視圖中訪問它來解析一些字符串。
我將 go 用於擴展方法,然后在其中解決我的依賴關系:
public static class LocalizationExtentions
{
public static string Localize(this HtmlHelper html, string resource)
{
var localize = IoC.Resolve<ILocalize>();
return localize.For(resource);
}
}
在我看來:
<h1><%= Html.Localize("MainTitle") %></h1>
您能否在您的 controller 中解析它,然后將其放入 ViewModel 以訪問已解析的實例?
我不使用 Winsor,但我認為當您使用帶有代碼隱藏的視圖時,setter 注入是可能的。 為什么要解決對視圖的依賴? 這聽起來像是一件奇怪的事情。
你能不能用一個wrapper,在wrapper里面直接讓Windsor幫你解決服務問題。 然后從您的角度來看,只需使用 ResourceHelper class 即可將所有內容傳遞給您已解析的服務嗎? 您可以在視圖中像使用 HtmlHelper class 一樣使用 ResourceHelper class。
public interface IInjectionWrapper
{
T Resolve<T>();
object Resolve(Type service, object view);
object Resolve(Type service);
}
public class WindsorWrapper: IInjectionWrapper
{
private readonly static IWindsorContainer windsor;
static WindsorWrapper()
{
string config = ConfigurationManager.AppSettings["WindsorConfig"];
FileResource resource = new FileResource(config);
windsor = new WindsorContainer(new XmlInterpreter(resource));
}
public T Resolve<T>()
{
T result = windsor.Resolve<T>();
return result;
}
public object Resolve(Type service)
{
return windsor.Resolve(service);
}
}
public interface IResourceService
{
string LookupString(string key);
}
public class ResourceHelper : IResourceService
{
private IResourceService _resources;
public ResourceHelper()
{
IInjectionWrapper ioc = new WindsorWrapper();
_resources = ioc.Reslove<IResourceService>();
}
public string LookupString(string key)
{
return _resources.LookupString(key);
}
}
你願意下載源代碼,做一些小的修改並使用它嗎? 如果是這樣,您可以通過對 web forms 視圖引擎進行一些小的更改來實現,以便在構建管理器創建編譯頁面 object 之后,您可以進行屬性注入。
否則,它會變得很難看,除非您創建一個基類 controller 並覆蓋操作執行方法並注入視圖數據。
編輯
http://as.net.codeplex.com/sourcecontrol/changeset/view/23011?projectName=as.net#266535
是處理創建頁面實例的文件,在 null 檢查 viewInstance 之后,您可以要求您的服務定位器進行屬性注入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.