控制器是否应该从web.config中读取自定义应用程序设置
本文关键字:读取 自定义 应用程序 设置 config web 是否 控制器 | 更新日期: 2023-09-27 18:19:45
在我的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
}
}
}
我想说这其实并不重要。将其添加为模型的属性,感觉会有更多的分离。
不过,重要的是你的包装器是静态的。这将使模拟它用于单元测试(或任何其他目的)变得非常困难。
控制器中不应有任何逻辑。例如:我应该把我的控制器业务逻辑放在MVC3 的哪里
或者这个:https://softwareengineering.stackexchange.com/questions/165444/where-to-put-business-logic-in-mvc-design
我知道这很诱人,但你越不讲逻辑,你将来就会发现自己是最好的。
我认为答案是:
您应该在业务层中读取属性,使控制器弯曲,并将其一直传递到模型对象中的视图。
我通常同意Maurizio的观点,即所有业务逻辑都应该在某个服务/业务逻辑层中。然而,在这种情况下,由于您只从web.config中获取值,无论在控制器操作中是否执行以下操作:
var someValue = App.TaxBillLink;
否则:
var someValue = _linkService.GetTodaysLink();
除非有某种逻辑需要进行单元测试,否则真的没什么大不了的。