【问题标题】:Should Controllers read custom app settings from web.config?控制器是否应该从 web.config 读取自定义应用程序设置?
【发布时间】:2013-06-25 13:03:14
【问题描述】:

在一年中的某些时候,在我的 mvc 应用程序中,我们希望显示两个链接之一。基本上,当我接到管理层的电话时,我必须切换链接。因此,我认为不必重新编译应用程序,而是将自定义应用程序设置添加到 web.config 文件。然后我创建了一个包装器,以便它是强类型的。现在,我的问题是我不知道在哪里执行逻辑。应该向我的视图模型添加一个属性并根据配置设置值在控制器中设置它吗?或者我应该直接在我的视图中阅读它并在两个链接之间切换?我很确定它只属于视图或控制器,而不属于服务层,因为它专门用于 UI 的东西。

Details.cshtml //当前代码

 @if(Search.App.ParcelDetailDisplayMode == Search.App.DisplayMode.Tax ){
     <a id="tax-link" href="@taxlink" title="View Tax Bill on Tax Collectors Website">Tax Bill</a>
 }
 else if(Search.App.ParcelDetailDisplayMode == Search.App.DisplayMode.Trim ){
        <a id="trim-link" href="@trimlink" title="View your TRIM notice online">Trim Notice</a>
 }  

web.config

<add key="ParcelDetailDisplayMode" value="Tax"/>

配置包装器

namespace Search
{
    /// <summary>
    /// The app.
    /// </summary>
    public static class App
    {
        /// <summary>
        /// Gets the tax bill link.
        /// </summary>
        public static string TaxBillLink
        {
            get
            {
                return ConfigurationManager.AppSettings["TaxBillLink"];
            }
        }

        /// <summary>
        /// Gets the trim notice link.
        /// </summary>
        public static string TrimNoticeLink
        {
            get
            {
                return ConfigurationManager.AppSettings["TrimLink"];
            }
        }

        /// <summary>
        /// Gets the map link.
        /// </summary>
        public static string MapLink
        {
            get
            {
                return ConfigurationManager.AppSettings["MapLink"];
            }
        }

        /// <summary>
        /// Gets the update address link.
        /// </summary>
        public static string UpdateAddressLink
        {
            get
            {
                return ConfigurationManager.AppSettings["UpdateAddressLink"];
            }
        }

        /// <summary>
        /// Gets the release name.
        /// </summary>
        public static string ReleaseName
        {
            get
            {
                return ConfigurationManager.AppSettings["ReleaseName"];
            }
        }

        /// <summary>
        /// Gets the parcel detail display mode.
        /// </summary>
        public static DisplayMode ParcelDetailDisplayMode
        {
            get
            {
                var r = DisplayMode.Tax;
                DisplayMode.TryParse(ConfigurationManager.AppSettings["ParcelDetailDisplayMode"], out r);
                return r;
            }
        }

        /// <summary>
        /// The display mode.
        /// </summary>
        public enum DisplayMode
        {
            /// <summary>
            /// The trim.
            /// </summary>
            Trim, 

            /// <summary>
            /// The tax.
            /// </summary>
            Tax
        }
    }
}

【问题讨论】:

    标签: c# asp.net-mvc web-config


    【解决方案1】:

    我会说这并不重要。将其添加为模型的属性感觉可以提供更多的分离。

    重要的是你的包装器是静态的。这将使得为了单元测试(或任何其他目的)而模拟它真的很困难

    【讨论】:

    • 哦。好的。我想这是有道理的。
    【解决方案2】:

    控制器中应该没有逻辑。 例如阅读:Where should I put my controller business logic in MVC3

    或者这个:https://softwareengineering.stackexchange.com/questions/165444/where-to-put-business-logic-in-mvc-design

    我知道这很诱人,但你放在那里的逻辑越少,你将来就会发现自己最好。

    我认为的答案是:

    您应该在控制器之前读取业务层中的属性,并将其一直传递到模型对象中的视图。

    【讨论】:

      【解决方案3】:

      我总体上同意 Maurizio 的观点,即所有业务逻辑都应该在某个服务/业务逻辑层中。但是在这种情况下,因为您只是从 web.config 中获取一个值,无论您在控制器操作中是否这样做:

      var someValue = App.TaxBillLink;
      

      或者你这样做:

      var someValue = _linkService.GetTodaysLink();
      

      除非有某种逻辑需要进行单元测试,否则真的没关系。

      【讨论】:

        猜你喜欢
        • 2012-01-24
        • 2014-11-20
        • 2011-06-02
        • 1970-01-01
        • 2014-11-22
        • 1970-01-01
        • 1970-01-01
        • 2011-09-23
        • 2012-02-25
        相关资源
        最近更新 更多