我已删除Unity,现在正尝试在其位置使用Ninject。在大多数情况下它都可以工作,但是我无法使用Web API 2。
我有一个NinjectWebCommon.cs文件(我没有改变,除了添加一些注册,如果我明确解决,它工作正常),我可以看到它是触发一个Start事件。但是,当我尝试访问Web API控制器时,它会抱怨没有公共无参数构造函数。
An error has occurred.","ExceptionMessage":"An error occurred when trying to create a controller of type 'PlaceOrderController'. Make sure that the controller has a parameterless public constructor.
我安装了这些Nuget软件包(昨天新鲜,所以应该是最新版本):
Ninject
Ninject.Extensions.Conventions
Ninject.Web.Common
Ninject.Web.Common.WebHost
Ninject.Web.WebApi
Ninject.Web.WebApi.WebHost
我在这个阶段没有做任何聪明的事情,只是一个带有构造函数的Web API控制器,该构造函数接受实现接口的依赖。使用Unity,我让它在几分钟内完成,但Ninject似乎是一个配置噩梦!
我错过了哪些额外步骤?
NinjectWebCommons.cs
public static class NinjectWebCommon
{
static NinjectWebCommon()
{
Kernel = new InterceptAllModule();
}
private static readonly Bootstrapper bootstrapper = new Bootstrapper();
public static void Start()
{
DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
bootstrapper.Initialize(() => CreateKernel(Kernel));
}
public static void Stop()
{
bootstrapper.ShutDown();
}
private static IKernel CreateKernel()
{
var kernel = new StandardKernel();
try
{
kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
RegisterServices(kernel);
return kernel;
}
catch
{
kernel.Dispose();
throw;
}
}
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<MyInterface>().To<MyClass>().InSingletonScope();
}
}
控制器:
public MyController : ApiController
{
private readonly MyInterface _myInterface;
public MyController(MyInterface myInterface)
{
_myInterface = myInterface;
}
. . .
}
答案 0 :(得分:1)
您尚未正确设置DependencyResolver。我尝试了几个Ninject包,由于Ninject和WebAPI(和MVC)的不兼容版本,我无法工作。 这篇文章:http://www.codeproject.com/Articles/412383/Dependency-Injection-in-asp-net-mvc-and-webapi-us 详细描述了如何设置WebAPI以将Ninject用作其依赖性解析器。
答案 1 :(得分:0)
从错误消息中,我认为控制器&#34; PlaceOrderController&#34;应该至少有一个公共构造函数接受MyInterface作为唯一的参数。
你可以发布控制器的代码吗?