Шаблон Setter Injection или Ambient Context

У меня есть некоторые глобальные компоненты, я не уверен, как их разместить в дизайне. Например:

  • Класс настроек:это взаимодействие с начальными настройками программы, это может быть 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?

8
задан Tom 26 July 2012 в 12:48
поделиться