문제

좋아, 그래서 나는 시스템 전체에 액세스 해야하는 특정 문자열을 저장하기 위해 설정 클래스를 만들려고합니다. 아래 코드와 함께 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 참조) -IE

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에 너무 익숙하지 않습니다. 지금은 조금 도전적입니다 :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top