Esto también se está volviendo molesto, no está SECO
Es verdad. Pero hay mucho que puede hacer por una preocupación transversal que impregna todos los tipos que tiene. Usted tiene que utilizar el registrador en todas partes, por lo que debe tener la propiedad de esos tipos.
Así que veamos qué podemos hacer al respecto.
único
Los singleton son terribles <flame-suit-on>
.
Recomiendo seguir con la inyección de propiedades como lo hizo con su segundo ejemplo. Este es el mejor factoring que puede hacer sin recurrir a la magia. Es mejor tener una dependencia explícita que ocultarla mediante un singleton.
Pero si los singleton le ahorran un tiempo significativo, incluida toda la refactorización que tendrá que hacer (¡tiempo de bola de cristal!), Supongo que podría vivir con ellos. Si alguna vez hubo un uso para un Singleton, este podría ser. Tenga en cuenta que el costo si alguna vez desea cambiar de opinión será tan alto como sea posible.
Si hace esto, revise las respuestas de otras personas usando el Registry
patrón (vea la descripción) y aquellos que registran una fábrica singleton (reiniciable) en lugar de una instancia de registrador singleton.
Hay otras alternativas que podrían funcionar igual de bien sin tanto compromiso, por lo que debe verificarlas primero.
Fragmentos de código de Visual Studio
Puede usar fragmentos de código de Visual Studio para acelerar la entrada de ese código repetitivo. Podrás escribir algo como logger
tab, y el código aparecerá mágicamente para ti.
Usando AOP para SECAR
Puede eliminar un poco de ese código de inyección de propiedad utilizando un marco de programación orientada a aspectos (AOP) como PostSharp para generar automáticamente parte de él.
Podría verse algo así cuando haya terminado:
[InjectedLogger]
public ILogger Logger { get; set; }
También puede usar su código de muestra de seguimiento de métodos para rastrear automáticamente el código de entrada y salida del método, lo que podría eliminar la necesidad de agregar algunas de las propiedades del registrador todas juntas. Puede aplicar el atributo a nivel de clase o en todo el espacio de nombres:
[Trace]
public class MyClass
{
}
#if DEBUG
[assembly: Trace( AttributeTargetTypes = "MyNamespace.*",
AttributeTargetTypeAttributes = MulticastAttributes.Public,
AttributeTargetMemberAttributes = MulticastAttributes.Public )]
#endif