Это тоже начинает раздражать - это не СУХОЕ
Это правда. Но вы можете сделать лишь так много для решения сквозной проблемы, которая пронизывает каждый ваш тип. Вы должны использовать регистратор везде, поэтому у вас должно быть свойство для этих типов.
Итак, давайте посмотрим, что мы можем с этим поделать.
Синглтон
Синглтоны ужасны <flame-suit-on>
.
Я рекомендую придерживаться инъекции свойств, как вы это сделали со вторым примером. Это лучший факторинг, который вы можете сделать, не прибегая к магии. Лучше иметь явную зависимость, чем скрывать ее через синглтон.
Но если синглтоны сэкономят вам значительное время, включая весь рефакторинг, который вам когда-либо придется делать (время хрустального шара!), Я полагаю, вы сможете с ними жить. Если когда-либо был использован синглтон, то это могло быть оно. Имейте в виду, что цена, если вы когда-нибудь захотите передумать, будет максимально высокой.
Если вы сделаете это, проверьте ответы других людей , используя в Registry
шаблон (см описание), и те , регистрируя (самовосстанавливающийся) одноплодной завод , а не экземпляр одноплодной регистратор.
Есть и другие альтернативы, которые могут работать так же хорошо без особых компромиссов, поэтому вам следует сначала проверить их.
Фрагменты кода Visual Studio
Вы можете использовать фрагменты кода Visual Studio, чтобы ускорить ввод этого повторяющегося кода. Вы сможете ввести что-то вродеlogger
tab , и код волшебным образом появится для вас.
Использование 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