2010-11-08 10 views
11

Soy nuevo en Ninject y tengo problemas para usarlo con un proveedor de membresía personalizado.Uso de Ninject con Membership.Provider

Mi proveedor de pertenencia tiene una interfaz de repositorio en el pasado que parece:.

public class CustomMembershipProvider : MembershipProvider 
{ 
    public CustomMembershipProvider(IRepository repository) 
    { 
    } 
} 

estoy usando el código de eso es parte del Modelo de cuentas en la aplicación MVC como punto de partida.

Sin embargo, cuando llama a Membership.Provider me sale un error que dice No parameterless constructor defined for this object.

He configurado los enlaces en ninject para vincular un IRepository a una clase Repository que funciona como lo he probado en un controlador.

¿Cuáles son los enlaces correctos en Ninject para usar en Membership.Provider?

+0

Por favor revise las respuestas y premiar el mejor si se puede – mare

Respuesta

9

Esta es la forma en que debe hacerse hoy con nuevas versiones de ambos MVC y Ninject (versión 3):

Usted tiene acceso a la instancia DependencyResolver y Ninject conjuntos como el DependencyResolver actual. De esta forma, no necesitas hacks para acceder al núcleo estático de Ninject. Tenga en cuenta, mi ejemplo utiliza mi propio repositorio IUserService de adhesión ...

IUserService _userService = DependencyResolver.Current.GetService<IUserService>(); 
+0

¿Cómo se hace esto en WebForms en lugar de MVC? – Tom

+0

Esta es una mejor solución que el uso directo del kernel ninject. – kaptan

+0

¡Muchas gracias! –

0

No he usado Ninject alguna vez. pero en StructureMap he de poner esto dependencia:

expression.For<MembershipProvider>().Add(System.Web.Security.Membership.Provider); 

y trabaja muy bien.

+2

esto no responde a la pregunta. Él pregunta cómo crear la instancia de proveedor, no cómo inyectar el proveedor en otra cosa. –

5

Dado que la colección de miembros y la instancia Membership.Provider se crean antes de que Ninject pueda instanciarlas, debe realizar la activación de creación posterior en el objeto. Si marca sus dependencias con [Inject] para sus propiedades en su clase de proveedor, puede llamar al kernel.Inject(Membership.Provider) - esto asignará todas las dependencias a sus propiedades.

+0

Una desventaja de esto es que crea una dependencia de Ninject en el proveedor. No es un gran problema, pero si su proveedor es parte de una biblioteca que debe tener la menor cantidad posible de dependencias externas, entonces no es divertido. – crush

9

La mejor solución que encontré fue la siguiente:

private IRepository _repository; 

[Inject] 
public IRepository Repository 
{ 
    get { return _repository; } 
    set { _repository= value; } 
} 

public CustomMembershipProvider() 
{ 
    NinjectHelper.Kernel.Inject(this); 
} 

Dónde NinjectHelper es una clase auxiliar estática para obtener el Kernel de.

+4

¿Qué es NinjectHelper? No puedo encontrarlo ¿Necesito crearlo solo? – Tomas

+0

+1 para usar el atributo, pero no para usar el "ayudante". Estás haciendo el antipattern de Localizador de servicios aquí (más o menos). Puede llamar al método "Inject" en WebActivator.PostApplicationStartMethod –

Cuestiones relacionadas