2013-10-01 26 views
0

我有一个相当小的网站,我正在处理,我已经达到了一个点,我需要将我的绝对路径到我的html中的相对路径。我为我的IoC使用了AutoFac,并且我构建了一个包装器,用于在我的项目中注入我的web.config应用程序设置,并使用此位运行到墙上:使用IoC框架,我需要从注入类获取值到扩展方法

我有一个名为“ContentServerPath”的配置值,包装需要照顾转嫁:

public interface IConfigurationWrapper 
{ 
    string ContentServerPath { get; } 
} 

和我的实现(非常简单):

public ConfigurationWrapper() 
     : this(ConfigurationManager.AppSettings, ConfigurationManager.ConnectionStrings) 
    { 
    } 


    internal ConfigurationWrapper(NameValueCollection appSettings, ConnectionStringSettingsCollection connectionStrings) 
    { 
     ContentServerPath = appSettings["ContentServerPath"]; 
    } 

我_layout.cshtml页面已初步编码为使用本地样式和jQuery,而网站是开发:

<link rel="stylesheet" type="text/css" href="~/assets/styles/site.css" /> 

最终输出我希望做的是沿着线的东西来代替HTML行:

<link rel="stylesheet" type="text/css" href="@Html.GetContentPath("assets/styles/site.css")" /> 

然而,它证明是一个可怕的任务,因为这样的事实,当我调用扩展方法,我不能将IConfigurationWrapper注入静态类。

我最初的想法是沿

public static MvcHtmlString GetContentPath(this HtmlHelper htmlHelper, string relativeContentPath) 
    { 
     return string.Format("{0}/{1}", _configuration.ContentServerPath, relativeContentPath); 
    } 

线的东西,但同样,我不能注入配置包装成静态方法。

作为一个方面说明,我把内容路径放入web.config的原因是因为我们有几个不同的测试环境,每个环境都需要它自己的内容配置值。我们依靠xdt转换为我们的构建服务器在部署代码和相应地修改配置之前选择任何更改。

任何人遇到过这样的事情,并有一个很好的解决方案?提前致谢!

回答

3

考虑允许的HtmlHelperExtensions上下文来指定依赖性:

public static class HtmlHelperExtensions 
{ 
    public static MvcHtmlString GetContentPath(this HtmlHelper htmlHelper, string relativeContentPath) 
    { 
     EnsureWrapper(); 

     return new MvcHtmlString(string.Format("{0}/{1}", ConfigurationWrapper.ContentServerPath, relativeContentPath)); 
    } 

    public static IConfigurationWrapper ConfigurationWrapper; 

    private static void EnsureWrapper() 
    { 
     if(ConfigurationWrapper == null) 
     { 
      throw new InvalidOperationException(); 
     } 
    } 
} 

然后,将其设置在该组合物根:

HtmlHelperExtensions.ConfigurationWrapper = container.Resolve<IConfigurationWrapper>(); 

这是一个实心图案时另一个库强制静态类,相当于静态依赖性反转。它强加了最少量的基础知识,类似于实例的构造函数注入。

你可以把它更进一步,绕过了中间商,简化HtmlHelperExtensions和外化的尽可能详细:

public static class HtmlHelperExtensions 
{ 
    public static MvcHtmlString GetContentPath(this HtmlHelper htmlHelper, string relativeContentPath) 
    { 
     EnsureContentServerPath(); 

     return new MvcHtmlString(string.Format("{0}/{1}", ContentServerPath, relativeContentPath)); 
    } 

    public static string ContentServerPath; 

    private static void EnsureContentServerPath() 
    { 
     if(EnsureContentServerPath == null) 
     { 
      throw new InvalidOperationException(); 
     } 
    } 
} 
0

那么几个小时的研究后,我结束了用我的扩展依赖解析器让我一直在寻找的配置值:

public static class HtmlHelperExtensions 
{ 
    public static MvcHtmlString GetContentPath(this HtmlHelper htmlHelper, string relativeContentPath) 
    { 
     return GetContentPath(relativeContentPath, AutofacDependencyResolver.Current.ApplicationContainer.Resolve<IConfigurationWrapper>()); 
    } 

    internal static MvcHtmlString GetContentPath(string relativeContentPath, IConfigurationWrapper configuration) 
    { 
     return new MvcHtmlString(string.Format("{0}/{1}", configuration.ContentServerPath, relativeContentPath);); 
    } 
} 

希望这至少可以帮助别人的道路!

-Troggy

+1

你应该使用AutofacDependencyResolver设置标准MVC DependencyResolver然后只是DependencyResolver.Current而不是直接访问应用程序容器。尽可能避免将组件直接从容器中分离出来是最佳做法。 –