Me gusta la inyección de Constructor para la inyección de dependencia. Obliga a una declaración clara de inquietudes de un tipo y ayuda con la capacidad de prueba.Alternativas de inyección de constructor (Castle Windsor)
me gusta la inyección de constructor, en la mayoría lugares ...
registro como un ejemplo en el que no gusta. Si tengo una clase base de la que heredan muchas otras clases, y quiero que todas esas clases utilicen una instancia de mi ILogger (o lo que sea), y no quiero una fábrica estática (Logger.Instance) ... no quiero tener que declarar un constructor en cada subclase que tome un ILogger.
Así, pude tener mi clase base declarar el registrador como una propiedad y tienen que inyectarse esa manera
public class MyBaseClass
{
public ILogger Logger { get; set; }
}
... pero
- que no me asegurar que Logger en realidad, se inyecta y no es nulo.
- no me gusta tener ILogger con un conjunto público
Así que ... ¿qué otras opciones tengo? (Estoy usando Castle Windsor).
he contemplado hacer una interfaz de
public interface IInitializable<T>
{
void Initialize(T instance);
}
public class MyBaseClass : IInitializable<ILogger>, ...could have other IInitializables too...
{
protected ILogger Logger { get; private set; }
public void Initialize(ILogger instance)
{
Logger = instance;
}
}
luego tener una instalación en mi contenedor que llama automáticamente a todas las implementaciones de IInitializable<T>
sobre construcción de tipo ...
Pero me pregunto qué otros pueblos 'pensamientos son antes de ir por esa ruta ...
¿Por qué no desea utilizar un patrón estático de fábrica? –
Ctor injection, etc., es muy útil para variadas implementaciones para pruebas, etc., de forma individual, pero ¿realmente lo necesita para iniciar sesión? ¿Realmente necesita la capacidad de variar la implementación de registro en el nivel de instancia? El patrón de fábrica estático todavía le dará la capacidad de variar la implementación del registro * en general * que generalmente es lo que se requiere. –
La implementación de lo que Logger devolver debe ser dinámico. Específicamente Logger.Instance debería ser diferente según el contexto (es decir, operación WCF, cliente WPF, cliente SL, etc.). Supongo que podría hacer un localizador de servicios dentro. Ahora, pero eso es como un antipatrón como lo entiendo ... – Jeff