У меня есть некоторые глобальные компоненты, я не уверен, как их разместить в дизайне. Например:
Класс настроек:это взаимодействие с начальными настройками программы, это может быть app.config (1way ), web.config (1way ), жестко закодированные значения (1way )или sqldb (. ] 2way )за кадром.
Языковой класс:он содержит разные наборы языков, и опять же, у меня могут быть некоторые файлы resx (1way ), жестко закодированные значения (1way )или sqldb (2way ).
Первый вопрос: должен ли я сделать эти классы установщиками свойств при внедрении зависимостей (Я использую Windsor):
public ISettings Settings {set;}
public ILanguage Language {set;}
Или я должен сделать их окружающим контекстом:
string DoSomethingAndReportIt() {
//do something...
var param = Settings.Current.SomeParam;
//report it...
return Language.Current.SomeClass_SomeMethod_Job_Done;
}
Я заметил, что в библиотеке.net есть несколько компонентов, которые фактически используют шаблон окружающего контекста,например. System.Security.Principal, System.Web.ProfileBase, System.Thread.CurrentCulture...
Как вы думаете, нет ничего плохого в том, чтобы сделать мои глобальные классы, такие как «Настройки» и «Язык», классами окружающего контекста? Если нет, то почему DI предпочтительнее? Получают ли они больше преимуществ в модульном тестировании по сравнению с окружающим?
Второй вопрос: если DI лучше, (у меня есть ощущение, что шаблон DI предпочтительнее ), каков хороший способ проксировать существующие внешние классы, такие как Security.Principal или Profile, чтобы следовать шаблону DI?