2012-03-28 4 views
1

Я преобразование проекта из WCF Web API для ASP.NET Web API - спасибо MS :(ASP.NET Web API (Self хоста) + 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, ILogger и т. Д.).

Должен ли я пройти один за другим и перерегистрировать все зависимости по умолчанию? Кажется странным, что значения по умолчанию регистрируются с помощью распознавателя зависимостей по умолчанию, но я не вижу быстрого способа перерегистрировать значения по умолчанию при установке нового зависимого преобразователя. Для чего-то вроде ILogger, я даже не могу получить доступ к умолчанию System.Web.Http.Common.Logging.DiagnosticLogger, чтобы сделать привязку.

Я что-то упустил?

ответ

2

Вам не нужно перерегистрировать службы по умолчанию. Если вы вернете нуль, инфраструктура по умолчанию вернется к внутреннему контейнеру DI. Кроме того, в последних битах он будет запрашивать только один раз.

+0

Возможно, тогда вопрос о том, что NinjectServiceLocator бросает исключение, когда отображение не найден. Я буду исследовать дальше. –

+0

@ Discofunk Да, это так. Но структура проглотит это исключение для вас. –

+0

Я вижу. При запуске в отладке VS2010 прерывается исключение, но затем, похоже, проглатывается. –

0

В конце концов, вероятно, лучше просто создать IDependencyResolver для Ninject. Я уверен, что будет «правильный» один созданный человеком, которого имеет большее знание 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 для полной реализации. –

 Смежные вопросы

  • Нет связанных вопросов^_^