【问题标题】:ASP.NET Web API (Self Host) + Ninject - Default BindingsASP.NET Web API(自托管)+ Ninject - 默认绑定
【发布时间】:2012-03-28 22:22:27
【问题描述】:

我正在将一个项目从 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) 感觉有点脏。

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

我是否必须一个接一个地重新注册所有“默认”依赖项?使用默认依赖解析器注册默认值似乎很奇怪,但是当设置新的依赖解析器时,我看不到重新注册默认值的快速方法。对于ILogger 之类的东西,我什至无法访问默认的System.Web.Http.Common.Logging.DiagnosticLogger 来进行绑定。

我错过了什么吗?

【问题讨论】:

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


    【解决方案1】:

    您不必重新注册默认服务。如果您返回 null,则框架将默认返回其内部 DI 容器。此外,在最新的位中,它只会询问一次。

    【讨论】:

    • 也许问题是 NinjectServiceLocator 在找不到映射时抛出异常。我会进一步调查。
    • @Discofunk 是的。但是框架会为你吞下这个例外。
    • 我明白了。在调试 VS2010 中运行时出现异常中断但随后似乎被吞没了。
    【解决方案2】:

    最后,为 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
    }
    

    【讨论】:

    猜你喜欢
    • 2012-06-06
    • 2015-01-09
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 2015-04-14
    • 1970-01-01
    相关资源
    最近更新 更多