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
}