.NET MVC-グローバル設定クラス-これらの方法のうちどれが最適ですか:
-
22-07-2019 - |
質問
OKですので、システム全体でアクセスする必要がある特定の文字列を保存する設定クラスを作成しようとしています。次のコードで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();
**コンストラクタをプライベートに設定し、シングルトンパターンを実装する必要があるのは、結局設定クラスであり、1つのインスタンスのみが必要ですか?
設定情報を使用してコントローラークラスを拡張する方が良いでしょうか
**
解決
個人的には、これらのことをむしろ区分化したいと思います。たとえば、すべてのコントローラーがイベントログの書き込みについて知る必要があるのはなぜですか?私は単一の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
}
辞書は、設定から取得される場合に役立ちます。それらが真にグローバルな場合、静的辞書で十分です-インスタンスは、インプレッション間で変化する場合にのみ有用です。ここではシングルトンは何の目的も果たしません。代わりに静的メンバーを使用してください。
他のヒント
@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にあまり慣れていないので、現時点では少し難しいと感じています:)