ASP.NET Web API (Self Host) + Ninject - привязки по умолчанию

Я конвертирую проект из WCF Web API в ASP.NET Web API - спасибо MS:(

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 ответа

Решение

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

В конце, вероятно, лучше просто создать 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
}
Другие вопросы по тегам