1

システム全体でアクセスする必要がある特定の文字列を格納するための設定クラスを作成しようとしています。以下のコードで 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();

**コンストラクターをプライベートに設定し、シングルトン パターンを実装する必要がありますか?

設定情報を含むコントローラークラスを拡張した方がよいでしょうか?

**

4

2 に答える 2

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
}

辞書は、構成からフェッチされる場合に役立ちます。それらが真にグローバルである場合、静的辞書で十分です。インスタンスは、インプレッション間で変化する場合にのみ役立ちます。ここではシングルトンは何の役にも立ちません。代わりに静的メンバーを使用してください。

于 2009-03-13T12:23:40.440 に答える
0

@マーク・グラベル

これまでのところ、メインコントローラーがあります:

    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に慣れていないので、現時点では少し難しいと感じています:)

于 2009-03-17T14:35:46.607 に答える