ASP.NET Web API(自主机)+ Ninject - 默认绑定

时间:2012-03-28 22:22:27

标签: ninject-2 asp.net-web-api ninject-extensions

我正在将项目从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(对象)感觉有点脏,但这似乎可以解决。

我现在遇到的问题是,当我尝试运行它时,会有很多不再注册的绑定(例如IHttpContollerFactoryILogger等)。

我是否必须逐个完成并重新注册所有“默认”依赖项?使用默认依赖项解析程序注册默认值似乎很奇怪,但是当设置新的依赖项解析程序时,我看不到快速重新注册默认值的方法。对于像ILogger这样的内容,我甚至无法访问默认的System.Web.Http.Common.Logging.DiagnosticLogger来进行绑定。

我错过了什么吗?

2 个答案:

答案 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
}