2012-03-28 31 views
1

我从WCF的Web API转换项目的ASP.NET Web API - 感谢MS :(的ASP.NET Web API(自主机)+ Ninject - 默认绑定

自托管POC代码:

static void Main(string[] args) 
    { 
     var kernel = new StandardKernel(); 

     const string baseAddress = "http://localhost:8080"; 
     var config = new HttpSelfHostConfiguration(baseAddress); 
     config.ServiceResolver.SetResolver(new NinjectServiceLocator(kernel)); 

     config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new {id = RouteParameter.Optional}); 

     var server = new HttpSelfHostServer(config); 
     server.OpenAsync().Wait(); 
     Console.WriteLine("The server is running...."); 
     Console.ReadLine(); 
    } 

我注册Ninject的依赖解析器要做到这一点,我现在用的是CommonServiceLocator.NinjectAdapter进行注册:

config.ServiceResolver.SetResolver(new NinjectServiceLocator(kernel)); 

这似乎就工作,我可以告诉虽然感觉有点使用SetResolver(对象)脏。

我现在的问题是当我尝试运行它时,有很多不再注册的绑定(即IHttpContollerFactory,​​等)。

我是否必须一个接一个地重新注册所有“默认”依赖项?使用默认的依赖关系解析器注册默认值似乎很奇怪,但是当设置新的依赖关系解析器时,我看不到快速重新注册默认值的方法。对于像​​这样的东西,我似乎无法访问默认的System.Web.Http.Common.Logging.DiagnosticLogger来进行绑定。

我错过了什么吗?

回答

2

您不必重新注册默认服务。如果返回null,框架将默认回到它的内部DI容器。此外,在最新的比特中,它只会问一次。

+0

也许那时的问题是,NinjectServiceLocator抛出一个异常时,映射未找到。我会进一步调查。 – 2012-03-29 03:43:58

+0

@Discofunk是的,它的确如此。但是框架会吞噬你的例外。 – 2012-03-29 13:03:03

+0

我明白了。当在调试中运行时VS2010在异常中断了,但似乎被吞下了。 – 2012-03-29 15:34:09

0

最后,最好为Ninject创建一个IDependencyResolver。我相信会有一个“正确”的一个被人谁拥有Ninject的更多知识创造,但现在我使用:

public class NinjectDependencyResolverAdapter : IDependencyResolver 
{ 
    private readonly IKernel kernel; 

    public NinjectDependencyResolverAdapter(IKernel kernel) 
    { 
     this.kernel = kernel; 
    } 

    #region Implementation of IDependencyResolver 

    public object GetService(Type serviceType) 
    { 
     return kernel.TryGet(serviceType); 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     return kernel.GetAll(serviceType); 
    } 

    #endregion 
} 
+0

请参阅https://github.com/sethwebster/NinjectDependencyResolver以获取完整的实现。 – 2016-10-14 06:46:43