我正在将项目从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
来进行绑定。
我错过了什么吗?
答案 0 :(得分:2)
您无需重新注册默认服务。如果返回null,框架将默认返回其内部DI容器。此外,在最新的位中它只会询问一次。
答案 1 :(得分: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
}