我正在努力在Web服务应用程序中启用Ninject的构造函数注入。这是我采取的步骤(Visual Studio 2013):
1)使用“ASP.NET Web应用程序”模板创建了一个新项目。
2)在项目创建向导的第二步中选择“空”应用程序模板。
3)在第三步中,为“添加文件夹和核心参考”选择“Web API”
4)项目已创建,现在我添加了一个“Web API 2 Controller - Empty”类型的控制器。添加了以下代码:
using System.Web.Http;
namespace WebApplication1.Controllers
{
public interface IDummy
{
}
public class Dummy : IDummy
{
}
public class DefaultController : ApiController
{
public DefaultController(IDummy dummy)
{
}
[HttpGet]
[Route("")]
public string Index()
{
return "Hello World!";
}
}
}
5)安装的NuGet包:Ninject.Web.WebApi(WebApi2的Ninject集成),现在我发现在其他线程中使它与IIS一起工作我需要安装Ninject.Web.Common.WebHost包。在此之后,NinjectWebCommon.cs文件出现在AppStart中。我为这个文件做的唯一编辑是RegisterServices方法:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IDummy>().To<Dummy>();
}
现在,当我尝试运行应用程序(本地,只需在Visual Studio中按F5)时,我希望在浏览器中获取Hello World字符串,但是我得到了臭名昭着的无参数构造函数错误: 这意味着Ninject由于某种原因不能正常工作。不幸的是谷歌搜索解决方案到目前为止没有结果。任何人都可以暗示我该怎么做才能使这项工作?提前谢谢。
答案 0 :(得分:0)
通过使用this solution,我能够非常简单地完成这项工作。您只需安装Ninject.Web.WebApi
,然后添加以下代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http.Dependencies;
using Ninject;
using Ninject.Activation;
using Ninject.Parameters;
using Ninject.Syntax;
internal class NinjectDependencyResolver : NinjectScope, IDependencyResolver
{
private readonly IKernel kernel;
public NinjectDependencyResolver(IKernel kernel)
: base(kernel)
{
if (kernel == null)
throw new ArgumentNullException("kernel");
this.kernel = kernel;
}
public IDependencyScope BeginScope()
{
return new NinjectScope(this.kernel.BeginBlock());
}
}
internal class NinjectScope : IDependencyScope
{
protected IResolutionRoot resolutionRoot;
public NinjectScope(IResolutionRoot kernel)
{
resolutionRoot = kernel;
}
public object GetService(Type serviceType)
{
IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
return resolutionRoot.Resolve(request).SingleOrDefault();
}
public IEnumerable<object> GetServices(Type serviceType)
{
IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
return resolutionRoot.Resolve(request).ToList();
}
public void Dispose()
{
IDisposable disposable = (IDisposable)resolutionRoot;
if (disposable != null) disposable.Dispose();
resolutionRoot = null;
}
}
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
IKernel kernel = new StandardKernel();
kernel.Bind<IDummy>().To<Dummy>();
config.DependencyResolver = new NinjectDependencyResolver(kernel);
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}