2011-05-06 50 views
7

因此,我一直在玩弄WCF Web API的最新版本,并决定我想用它来实现Ninject。使用新的WCF Web API设置Ninject

基于关我读过,我需要实现该接口IResourceFactory这就要求下面的方法:

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

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

所以我的鸡抓了以下出来:

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)); 
    //} 
} 

和有线起来与

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

令人惊讶的是,这似乎工作。我创建的第一个资源方法用于提供状态/省份列表,用HTTP 200 OK生成输出。

所以,这个问题。有没有清洁剂写这种工厂的方式?我真的太过分了,它感觉不对。我觉得我失去了一些明显盯着我的脸。我在新的Resolve方法中所做的破解感觉特别脏,所以我想我会挖掘那些更加有经验的人来收紧它。是否有其他人使用WCF Web API实施Ninject并实施了更清洁的解决方案?

感谢您的任何意见!

+0

这看起来和我在结构图上做的东西比较相似。传递对象总是感觉有点冒险,但如果它的框架给了你什么,除了滚动你自己之外还有什么选择。 – 2011-05-06 02:44:14

回答

0

您可以通过从应用程序范围传入内核来实现它。

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

是的,这清理了工厂一点点。我真正试图解决的部分是Resolve方法被迫返回一个对象而不是类型化的结果,但我想这个实现将不得不做直到/如果微软团队修改了返回值。 – Khepri 2011-05-06 15:50:51

+0

IResourceFactory从哪里来?这是一个Web API接口吗?我试图让这与Web API的预览版5一起工作,但没有任何运气?你使用Ninject.MVC或WCF扩展或两者?谢谢。 – Cragly 2011-09-30 07:28:45

+0

@Cragly这个答案用于预览3我认为,不适用于预览5 – Jonathan 2011-10-03 23:48:21