Espero que Peter o Ruben vean esta pregunta, ya que parecen ser los chicos con respecto a Ninject. Necesitaba crear un proveedor personalizado porque tengo una clase que toma 4 argumentos. Los dos se pueden inyectar porque son tipos, pero los otros dos son parámetros de configuración y son enteros. Se refieren a tiempos de espera en milisegundos.Usando Ninject, si creo un proveedor personalizado, ¿debo garantizar una sola instancia o puedo usar el atributo SingleInstance?
[SingleInstance]
MyClass
{
ISomething something;
IOther other;
int timeout;
int delay;
[Inject]
MyClass(ISomething something, IOther other, int timeout, int delay)
{
this.something = something;
this.other = other;
this.timeout = timeout;
this.delay = delay;
}
}
Yo confiaba previamente en una fábrica que había creado para obtener los ajustes de configuración de tiempo de espera y de demora y para inyectar algo y otra. Ahora parece hacerlo bien, tendría que crear mi propio proveedor personalizado. Con lo que estoy de acuerdo.
Un par de puntos de puntos extra:
- Sé que podría utilizar la inyección de los parámetros . Pero eso crea una API engañosa . Los objetos deben ser devueltos en un estado listo para usar y sin esos 4 argumentos, no está listo para usar.
- El mismo argumento aplica al método de inyección.
Por lo tanto, mis preguntas finales:
- ¿Eso significa que estoy en control de asegurar la única instancia de nuevo o a Ninject todavía cuidar de él a través de la [SingleInstance] atribuir?
- ¿No debería volver a cambiar a la fábrica que tenía? ¿Qué gano al usar Ninject en este caso?
ACTUALIZACIÓN: Ejemplo de código conforme a lo solicitado
A continuación, el profesional Asumo le gustaría algo como esto:
class MyClassProvider : SimpleProvider<MyClass> {
protected override MyClass CreateInstance(IContext context) {
int timeout= ConfigurationManager.AppSettings.Get("timeout");
int delay= ConfiguraionManager.AppSettings.Get("delay");
ISomething something = new SomethingImpl();
IOther other = new OtherImpl();
MyClass newOne = New MyClass(something, other, timeout, delay);
}
}
Pero debido a que ahora estoy utilizando un proveedor tiene mecanismos que la circunvalación de ninject de asegurar solamente se crea una sola instancia del objeto así que tengo que recurrir a:
class MyClassProvider : SimpleProvider<MyClass> {
protected static readonly MyClass myClassInstance;
private static object locker = new object();
protected override MyClass CreateInstance(IContext context) {
if (myClassInstance == null)
{
lock (locker)
{
int timeout = ConfigurationManager.AppSettings.Get("timeout");
int delay = ConfiguraionManager.AppSettings.Get("delay ");
ISomething something = new SomethingImpl();
IOther other = new OtherImpl();
MyClass newOne = New MyClass(something, other, timeout, delay);
}
return MyClassInstance
}
return myClassInstance
}
}
¿Hay algo th ¿Me estoy perdiendo?
Parece que desea una respuesta específica de Ninject, pero también considere hacer que su código sea menos dependiente de un contenedor específico, y más expresivo en general: http://stackoverflow.com/questions/2045904/dependency-inject-di- friendly-library/2047657 # 2047657 Específicamente, es posible que Abstract Factory sea un patrón útil para aplicar en este caso. –
Hola Actualmente estoy usando el patrón Abstract Factory. Sí, es muy específico para Ninject. Estoy usando Ninject para la inyección de dependencia. Tal vez debería ponerlo en el título, pero pensé que la etiqueta era suficiente. Editará el título ahora. – uriDium
La etiqueta estaba bien, y entendí que preguntaste específicamente sobre Ninject. Esa fue la razón por la que puse mi comentario como un comentario, y no como una respuesta "correcta" :) –