Це теж дратує - це не СУХО
Це правда. Але ви можете зробити так багато для наскрізних проблем, які охоплюють усі ваші типи. Ви повинні використовувати реєстратор скрізь, тому ви повинні мати властивість для цих типів.
Тож давайте подивимося, що ми можемо з цим зробити.
Сінглтон
Одинокі страшні <flame-suit-on>
.
Я рекомендую дотримуватися введення властивостей, як це було зроблено у вашому другому прикладі. Це найкращий факторинг, який ви можете зробити, не вдаючись до магії. Краще мати явну залежність, ніж приховувати її через синглтон.
Але якщо одинаки заощадять вам значний час, включаючи весь процес рефакторингу, який вам коли-небудь доведеться зробити (час кришталевої кулі!), Я думаю, ви могли б жити з ними. Якщо коли-небудь було використано Синглтона, це може бути саме цим. Майте на увазі, якщо ви коли-небудь захочете передумати, вартість буде приблизно такою ж високою, наскільки вона буде.
Якщо ви зробите це, перевірте відповіді інших людей , використовуючи в Registry
шаблон (див опис), і ті , реєструючи (самовідновлюється) одноплодной завод , а не примірник одноплодной реєстратор.
Є й інші альтернативи, які можуть працювати так само добре без особливих компромісів, тому спочатку слід їх перевірити.
Фрагменти коду Visual Studio
Ви можете використовувати фрагменти коду Visual Studio, щоб пришвидшити введення цього повторюваного коду. Ви зможете набрати щось на зразок logger
tab, і код чарівно з’явиться для вас.
Використання AOP для СУШЕННЯ
Ви можете усунути трохи цього коду введення властивостей, використовуючи структуру Aspect Oriented Programming (AOP), таку як PostSharp, для автоматичного генерування частини з нього.
Коли ви закінчите, це може виглядати приблизно так:
[InjectedLogger]
public ILogger Logger { get; set; }
Ви також можете використовувати їх зразок коду відстеження методу для автоматичного відстеження коду входу та виходу методу, що може усунути необхідність додавати деякі властивості реєстратора разом. Ви можете застосувати атрибут на рівні класу або просторі імен:
[Trace]
public class MyClass
{
}
#if DEBUG
[assembly: Trace( AttributeTargetTypes = "MyNamespace.*",
AttributeTargetTypeAttributes = MulticastAttributes.Public,
AttributeTargetMemberAttributes = MulticastAttributes.Public )]
#endif