2012-03-01 6 views
7

Al tratar de configurar ServiceStack.net para utilizar Ninject como su IOC, recibo errores que hacen referencia a que no se han definido varias vinculaciones. Principalmente para ICache Client.Cómo configurar Ninject para que funcione con ServiceStack.net

¿Qué enlaces específicos deben crearse para utilizar Ninject correctamente?

Actualmente han especificado:

Bind<ISessionFactory>().To<SessionFactory>();//Is this correct/needed? 

Nota

He creado una IContainerAdapter según el documention ServiceStack para implementar el uso de Ninject. (que se encuentra aquí: ServiceStack IOC Docs)

Nota 2 Mi método apphost de configuración es el siguiente:

public override void Configure(Funq.Container container) 
{ 
     IKernel kernel = new StandardKernel(new BindingModule()); 
     container.Adapter = new NinjectContainerAdapter(kernel); 
} 

Nota 3

He registrado el ICacheClient de la siguiente manera: bind ().A();

Y ahora estoy recibiendo un error señalando IRequest

Error activating IRequestLogger\nNo matching bindings are available, and the type is not self-bindable 

adaptador del recipiente

public class NinjectContainerAdapter : IContainerAdapter 
{ 
    private readonly IKernel _kernel; 

    public NinjectContainerAdapter(IKernel kernel) 
    { 
     this._kernel = kernel; 
    } 

    public T TryResolve<T>() 
    { 
     return this._kernel.Get<T>(); 
    } 

    public T Resolve<T>() 
    { 
     return this._kernel.Get<T>(); 
    } 
} 

Respuesta

9

¿Ha inyectado su adaptador de contenedor con:

container.Adapter = new NinjectIocAdapter(kernel); 

Si es así, intente también hacer su clase AppHost interna si no lo ha hecho. Solo debería haber 1 instancia de AppHost y algunos IOC como para crear su propia instancia, borrando toda la configuración de la primera.

El comportamiento que está recibiendo suena como Ninject se queja de dependencias no resueltas. Asegúrese de obtener Ninject para volver nula con dependencias no resueltas mediante el uso de kernal.TryGet<T> en su adaptador del recipiente, por ejemplo:

public T TryResolve<T>() 
{ 
    return this._kernel.TryGet<T>(); 
} 
+0

Sí, por favor, vea mi segunda nota anterior. También intenté cambiar a interno con no éxito – stephen776

+0

Mensaje de error: Error al activar ICacheClient \ nNo hay enlaces coincidentes disponibles, y el tipo no es autocompatible – stephen776

+0

¿Ha registrado un ICacheClient? Tenga en cuenta que las inyecciones de propiedad utilizan la interfaz TryResolve que su adaptador debe devolver nulo para las dependencias no encontradas/no registradas. El error parece un Ninject uno. De lo contrario, podría registrarlo explícitamente con Bind (). A (); pero devolver nulo es mejor ya que es el comportamiento esperado. – mythz

1

Usted tiene que escribir su propio IContainerAdapter y luego configure Container.Adapter en su apphost

+0

he hecho esto. Por favor, mira editar arriba. – stephen776

Cuestiones relacionadas