C# 控制器应该从web.config读取自定义应用程序设置吗?

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

在我的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>
 }  
@if(Search.App.ParcelDetailDisplayMode==Search.App.DisplayMode.Tax){
}
else if(Search.App.ParcelDetailDisplayMode==Search.App.DisplayMode.Trim){
}  
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
        }
    }
}
名称空间搜索
{
/// 
///应用程序。
/// 
公共静态类应用程序
{
/// 
///获取税单链接。
/// 
公共静态字符串TaxBillLink
{
得到
{
返回ConfigurationManager.AppSettings[“TaxBillLink”];
}
}
/// 
///获取修剪通知链接。
/// 
公共静态字符串微调器
{
得到
{
返回ConfigurationManager.AppSettings[“TrimLink”];
}
}
/// 
///获取地图链接。
/// 
公共静态字符串映射链接
{
得到
{
返回ConfigurationManager.AppSettings[“MapLink”];
}
}
/// 
///获取更新地址链接。
/// 
公共静态字符串UpdatedDressLink
{
得到
{
返回ConfigurationManager.AppSettings[“UpdateAddressLink”];
}
}
/// 
///获取发布名称。
/// 
公共静态字符串ReleaseName
{
得到
{
返回ConfigurationManager.AppSettings[“ReleaseName”];
}
}
/// 
///获取地块详细信息显示模式。
/// 
公共静态显示模式ParcelDetailDisplayMode
{
得到
{
var r=显示模式。税;
DisplayMode.TryParse(ConfigurationManager.AppSettings[“ParcelDetailDisplayMode”],out r);
返回r;
}
}
/// 
///显示模式。
/// 
公共枚举显示模式
{
/// 
///修剪。
/// 
修剪,
/// 
///税收。
/// 
税
}
}
}

控制器中不应有逻辑。 请阅读以下示例:

或者这个:

我知道这很有诱惑力,但你越不讲逻辑,你就越能在未来找到最好的自己

我认为答案是:
您应该在业务层中读取您的属性,并将其传递到模型对象中的视图。

我认为这并不重要。将其添加为模型的属性会给人一种更大的分离感


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

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

var someValue = App.TaxBillLink;
或者你会:

var someValue = _linkService.GetTodaysLink();

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

噢。可以我想这是有道理的。