.NET MVC - 全局设置类 - 它的这些方法是最好的:
-
22-07-2019 - |
题
行,所以我试着去创建一个设置类来存储我需要整个系统访问某些字符串。我已经创建与下面的代码globalSettings.cs:
public class GlobalSettings
{
private readonly Hashtable myHT;
public GlobalSettings()
{
//Hashtable used to store global strings
myHT = new Hashtable();
myHT.Add("logCategory","TMBC"); //event log category
myHT.Add("logSource", "MVC"); //event log source
//setup required options
//Create log source if required
if (!EventLog.SourceExists(myHT["logSource"].ToString()))
{
EventLog.CreateEventSource(myHT["logSource"].ToString(), myHT["logCategory"].ToString());
}
}
public string getSetting(string key)
{
return myHT.ContainsKey(key) ? myHT[key].ToString() : null;
}
}
目前我已经结合下面的我的控制器中的每一个初始化这个类:
protected GlobalSettings globalSettings = new GlobalSettings();
**,我应该设置构造私人和实施Singleton模式,因为它毕竟是一个设置类,只需要一个实例?
将我会更好延伸至与该设置信息中的控制器类中呢?
**
解决方案
就个人而言,我宁愿划分那些东西。例如,为什么所有的控制器需要知道写事件日志?我有一个单一的日志写类和ILogWriter接口,并使用依赖注入(参见MVCContrib样品) - 即
class FooController : Controller {
private readonly ILogWriter logWriter;
public FooController(ILogWriter logWriter) {
this.logWriter = logWriter; // <==== edited for clarity
}
}
(和使用基于DI-控制器工厂)
这允许你单元测试日志写入由嘲笑日志 - 写入器。然后设置将适合相当好作为日志写类的内部常数(或从配置取出)。
重新的具体问题;如果所有的值是恒定的,使用常量(或者静态属性):
public static GlobalSettings
{
public static const string LogCategory = "TMBC"; //event log category
public static const string LogSource = "MVC"; //event log source
}
一个字典是,如果它们是从配置取出有用;如果他们是真正的全球性,静态辞典应该足够了 - 情况下将只有当它展示之间的变化是有用的。单身就在这里没有意义;使用静态成员代替。
其他提示
@Marc Gravell
到目前为止我有我的主控制器:
public class TasksController : Controller
{
private tasklistDataContext db = new tasklistDataContext();
public TasksController(ILogWriter myWriter)
{
/* constructor */
}
//displays list of tasks
public ActionResult Index()
{
ViewData["Message"] = "Task List";
IOrderedQueryable<task> tasks = from t in db.tasks orderby t.entryDate descending select t;
return View(tasks.ToList());
}
}
在ILogWriter类到目前为止低于:
public class ILogWriter
{
public static string logCategory;
public static string logSource;
public ILogWriter()
{
logCategory = "TMBC";
logSource = "MVC";
//Create log source if required
if (!EventLog.SourceExists(logSource))
{
EventLog.CreateEventSource(logSource, logCategory);
}
}
public void writeLog(string eventMsg)
{
EventLog.WriteEntry(logSource, eventMsg, EventLogEntryType.Error);
}
}
我知道这应该是简单,但我很熟悉.NET我发现这一点在目前具有挑战性的:)
不隶属于 StackOverflow