2012-03-28 33 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