【问题标题】:.NET MVC - Global Settings Class - which of these methods is best:.NET MVC - 全局设置类 - 这些方法中哪个最好:
【发布时间】:2010-10-13 03:30:07
【问题描述】:

好的,所以我尝试创建一个设置类来存储我需要在整个系统中访问的某些字符串。我用下面的代码创建了一个 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();

**我应该将构造函数设置为私有并实现单例模式,因为它毕竟是一个设置类并且只需要一个实例吗?

我最好用其中的设置信息来扩展控制器类吗?

**

【问题讨论】:

    标签: .net asp.net-mvc settings global


    【解决方案1】:

    @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 太不熟悉了,我现在觉得它有点挑战性 :)

    【讨论】:

      【解决方案2】:

      就个人而言,我宁愿将这些东西分开。例如,为什么你所有的控制器都需要知道写事件日志?我将有一个 LogWriter 类和 ILogWriter 接口,并使用依赖注入(有关示例,请参阅 MVCContrib)-即

      class FooController : Controller {
          private readonly ILogWriter logWriter;
          public FooController(ILogWriter logWriter) {
              this.logWriter = logWriter; // <==== edited for clarity
          }
      }
      

      (并使用基于 DI 的控制器工厂)

      这允许您通过模拟日志编写器来对日志编写进行单元测试。然后这些设置将非常适合 LogWriter 类中的常量(或从配置中获取)。


      关于具体问题;如果所有值都是常量,请使用常量(或者静态属性):

      public static GlobalSettings
      {
          public static const string LogCategory = "TMBC"; //event log category
          public static const string LogSource = "MVC"; //event log source
      }
      

      如果它们是从配置中获取的,那么字典会很有用;如果它们确实是全局的,那么静态字典就足够了——实例只有在印象之间发生变化时才有用。单例在这里毫无用处;改用静态成员。

      【讨论】:

      • 所以当我需要它们时,通过构造函数传递日志编写器和全局设置是吗? class FooController : Controller { public FooController(ILogWriter logWriter,GlobalSettings mySettings) {/* 存储它 */}}
      • 在日志写入器场景中,我是说您不需要 全局设置对象;将该逻辑留给 log-writer 本地。
      • 好的,那么您是否仍然像我一样初始化全局设置类,但只是确保不要在它们中包含日志代码(并且使用常量而不是哈希表)?
      • 我只会包含 GlobalSettings 类,如果它做了一些有用的事情......在“将它封装在一个类中”方法(LogWriter)中,不需要在 GlobalSettings 中重复它。带有常量的 GlobalSettings 是一种 alterative 方法;不是 LogWriter 方法的一部分。
      • 每当我在下面调用代码 cimilar 并通过构造函数传递一个类时,我有点迷茫,但是当我尝试访问 logWriter.myMethod() 时,它说 logWriter 不存在? class FooController : Controller { public FooController(ILogWriter logWriter) {/* 存储它 */}}
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多