2011-05-06 12 views
7

Así que he estado jugando con la última versión de WCF Web API y decidí que quería sumergirme en la implementación de Ninject con ella.Configuración de Ninject con la nueva API web de WCF

base de lo que he leído que necesito para implementar la interfaz IResourceFactory que exige los siguientes métodos:

public object GetInstance(System.Type serviceType, 
           System.ServiceModel.InstanceContext instanceContext, 
           System.Net.Http.HttpRequestMessage request); 

    public void ReleaseInstance(System.ServiceModel.InstanceContext instanceContext, 
           object service); 

Así pollo Rasqué a cabo el siguiente:

public class NinjectResourceFactory : IResourceFactory 
{ 
    private readonly IKernel _kernel; 

    public NinjectResourceFactory() 
    { 
     var modules = new INinjectModule[] 
          { 
           new ServiceDIModule(), //Service Layer Module 
           new RepositoryDIModule(), //Repo Layer Module 
           new DataServiceDIModule() 
          }; 

     _kernel = new StandardKernel(modules); 
    } 

    #region IResourceFactory Members 

    public object GetInstance(Type serviceType, 
           InstanceContext instanceContext, 
           HttpRequestMessage request) 
    { 
     return Resolve(serviceType); 
    } 

    public void ReleaseInstance(InstanceContext instanceContext, object service) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 

    private object Resolve(Type type) 
    { 
     return _kernel.Get(type); 
    } 

    //private T Resolve<T>() 
    //{ 
    // return _kernel.Get<T>(); 
    //} 

    //private T Resolve<T>(string name) 
    //{ 
    // return _kernel.Get<T>(metaData => metaData.Has(name)); 
    // return _kernel.Get<T>().Equals(With.Parameters. 
    //         ContextVariable("name", name)); 
    //} 
} 

y por cable hasta con

var configuration = HttpHostConfiguration.Create().SetResourceFactory(new NinjectResourceFactory()); 
    RouteTable.Routes.MapServiceRoute<StateProvinceResource>("States", configuration); 

Sorprendentemente, esto parece funcionar. El primer método de recursos que creé para atender una lista de estados/provincias genera resultados con HTTP 200 OK.

Por lo tanto, a la pregunta. ¿Hay alguna manera de escribir esta fábrica? cleaner Realmente me puse nervioso y simplemente no me siento bien. Siento que me estoy perdiendo algo obvio, mirándome a la cara. El truco que hice en el nuevo método Resolve se siente especialmente sucio, así que pensé que podría recurrir a los más experimentados para ajustar esto. ¿Alguien más ha implementado Ninject con WCF Web API e implementado una solución más limpia?

¡Gracias por cualquier entrada!

+0

esto se ve relativamente similar a algo que he hecho con structuremap. pasar objetos siempre se siente un poco hacky, pero si es lo que te da el marco, qué opción hay, además de hacer tu propio curso. –

Respuesta

0

Puede implementarlo pasando el núcleo desde el ámbito de la aplicación.

public class NinjectResourceFactory : IResourceFactory 
{ 
    private readonly IKernel _kernel; 

    public NinjectResourceFactory(IKernel kernel) 
    { 
     _kernel = kernel; 
    } 

    public object GetInstance(Type serviceType, InstanceContext instanceContext, HttpRequestMessage request) 
    { 
     return _kernel.Get(serviceType); 
    } 

    public void ReleaseInstance(InstanceContext instanceContext, object service) 
    { 
     // no op 
    } 
} 
+0

Sí, eso limpia un poco la fábrica. La parte en la que realmente intentaba concentrarme era en arrinconar el método Resolve para devolver un objeto en lugar de un resultado mecanografiado, pero supongo que esta implementación tendrá que ver hasta que el equipo de Microsoft modifique el valor de retorno. – Khepri

+0

¿De dónde viene IResourceFactory? ¿Es esto una interfaz API web? Estoy tratando de hacer que esto funcione con la Vista previa 5 de la API web sin suerte? ¿Utilizaste las extensiones Ninject.MVC o WCF o ambas? Gracias. – Cragly

+0

@Cragly Esta respuesta fue para Vista previa 3 Creo que no aplicable a Vista previa 5 – Jonathan

Cuestiones relacionadas