簡體   English   中英

IoC 和 ASP.NET MVC 視圖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM