2010-09-09 16 views
8

Tengo una situación en la que deseo que la dependencia inycione mi objeto de usuario, pero también coloque al usuario actual en el contenedor de IoC. Quiero que las siguientes líneas de trabajo:En Ninject 2.0, ¿cómo puedo tener un enlace general y un enlace para un caso específico?

kernel.Get<User>(); // Should return a new User() 
kernel.Get<User>("Current"); // Should return the current user 

uno podría pensar encuadernaciones como esto funcionaría:

Bind<User>().ToSelf(); 
Bind<User>().ToMethod(LoadCurrentUser).InRequestScope().Named("Current"); 

Por supuesto, eso da:

Ninject.ActivationException: Error activating User 
More than one matching bindings are available. 
Activation path: 
1) Request for User 

Suggestions: 
1) Ensure that you have defined a binding for User only once.

entiendo el error ya que una La vinculación con nombre no restringe la aplicación de esa vinculación, por lo que se aplican ambas vinculaciones. Parece claro que necesito usar el enlace contextual con los métodos .When *() pero no puedo encontrar ninguna forma de hacerlo. Siento que debería haber cuando los métodos que detectan si se aplica una instancia con nombre. Algo así como:

// Not valid Ninject syntax 
Bind<User>().ToSelf().WhenUnnamedRequested(); 
Bind<User>().ToMethod(LoadCurrentUser).WhenNamedRequested().InRequestScope().Named("Current"); 

No puedo encontrar ningún lugar en la interfaz IRequest o no lo tenga propiedades que me dice el nombre solicitado. ¿Cómo hago esto?

Respuesta

3

Esta pregunta se respondidos en la lista de correo: http://groups.google.com/group/ninject/browse_thread/thread/cd95847dc4dcfc9d?hl=en


Si accede el usuario llamando a conseguir en el núcleo (que espero no lo hace) a continuación, dar la primera unión de un nombre como bien y acceder al usuario siempre por su nombre. En realidad, hay una manera de obtener una instancia del enlace sin un nombre. Pero como recomiendo encarecidamente no hacer esto, no muestro cómo hacerlo aquí. Si todavía quieres hacerlo de esta manera, te contaré más tarde cómo funcionaría.

Si está haciendo de la manera mejor y más preferido y se inyecta el usuario a los objetos que lo requieran como de dependencias que existen dos opciones:

  1. la más fácil: Dar la primera unión de un nombre y agregar un atributo con nombre a los parámetros, por ejemplo Héctor ([nombre ("NewUser") IUser NewUser, [nombre ("actual")] IUser CurrentUser)
  2. O la forma preferida para mantener las clases de implementación libre del marco de la COI: Especificar los atributos personalizados y añadir ellos a los parámetros, por ejemplo, ctor ([NewUser] IUser newUser, [CurrentUser] IUser currentUser). Cambiar los enlaces a:

    Bind<User>().ToSelf() 
          .WhenTargetHas<NewUserAttribute>(); 
    Bind<User>().ToMethod(LoadCurrentUser) 
          .InRequestScope() 
          .WhenTargetHas<CurrentUserAttribute>(); 
    
+0

siento por el largo retraso en la respuesta, no puedo hacer ninguna de estas porque cuando se solicita un nuevo usuario, lo que está sucediendo a través de NHibernate. Entonces no puedo agregar un nombre o un atributo a eso. Podría en los casos en que quiera el usuario actual, pero luego se aplicará el nuevo enlace de usuario. –

Cuestiones relacionadas