我正在将一个项目从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(object)感觉有点脏。
我现在遇到的问题是,当我尝试运行它时,有很多绑定不再注册(即IHttpContollerFactory、ILogger等)。
我是否必须逐一检查并重新注册所有的“默认”依赖项?使用默认依赖关系解析器注册默认值似乎很奇怪,但是当设置新的依赖关系解析器时,我看不到重新注册默认值的快速方法。对于像ILogger这样的东西,我似乎甚至无法访问默认的System.Web.Http.Common.Logging.DiagnosticLogger来进行绑定。
我是不是遗漏了什么?
发布于 2012-03-29 07:47:00
您不必重新注册默认服务。如果你返回null,框架将默认返回到它的内部DI容器。此外,在最新的比特中,它只会询问一次。
发布于 2012-03-29 23:48:30
最后,可能更好的方法是为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
}https://stackoverflow.com/questions/9916514
复制相似问题