1

我正在将一个项目从 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来进行绑定。

我错过了什么吗?

4

2 回答 2

2

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

于 2012-03-28T23:46:59.893 回答
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
}
于 2012-03-29T15:48:29.583 回答