Asp.net mvc 4 Ninject在ASP.NET MVC 4中的Web API构造函数中不工作
我不熟悉ASP.NET Web API 我已使用将我的ASP.NET MVC 3项目升级为ASP.NET MVC 4 现在我在这里尝试使用Web Api,正如您所看到的,我在这里尝试使用ninject,但是当我以这种方式声明Asp.net mvc 4 Ninject在ASP.NET MVC 4中的Web API构造函数中不工作,asp.net-mvc-4,asp.net-web-api,ninject,Asp.net Mvc 4,Asp.net Web Api,Ninject,我不熟悉ASP.NET Web API 我已使用将我的ASP.NET MVC 3项目升级为ASP.NET MVC 4 现在我在这里尝试使用Web Api,正如您所看到的,我在这里尝试使用ninject,但是当我以这种方式声明ProductsController构造函数时,这不起作用 public class ProductsController : ApiController { private readonly IProductService _productService;
ProductsController
构造函数时,这不起作用
public class ProductsController : ApiController
{
private readonly IProductService _productService;
public ProductsController(IProductService productService)
{
this._productService = productService;
}
public List<Product> GetProducts()
{
return _productService.GetAllProducts();
}
}
公共类产品控制器:ApiController
{
私有只读IPProductService\u productService;
公共产品控制器(IPProductService产品服务)
{
这是.\u productService=productService;
}
公共列表产品()
{
return_productService.GetAllProducts();
}
}
请帮我做这个
若我添加了这个构造函数,并没有调用WebAPI方法,我通过使用断点确认了这一点,否则它会调用。
浏览器显示一个xml错误,该错误读取
发生错误。
我的NinjectWebCommon.cs类代码为
[assembly: WebActivator.PreApplicationStartMethod(typeof(Web.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(Web.App_Start.NinjectWebCommon), "Stop")]
namespace Web.App_Start
{
public static class NinjectWebCommon
{
private static readonly Bootstrapper bootstrapper = new Bootstrapper();
/// <summary>
/// Starts the application
/// </summary>
public static void Start()
{
DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
bootstrapper.Initialize(CreateKernel);
}
/// <summary>
/// Stops the application.
/// </summary>
public static void Stop()
{
bootstrapper.ShutDown();
}
/// <summary>
/// Creates the kernel that will manage your application.
/// </summary>
/// <returns>The created kernel.</returns>
private static IKernel CreateKernel()
{
var kernel = new StandardKernel();
kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
RegisterServices(kernel);
return kernel;
}
/// <summary>
/// Load your modules or register your services here!
/// </summary>
/// <param name="kernel">The kernel.</param>
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IProductService>().To<ProductService>();
}
}
}
[程序集:WebActivator.PreApplicationStartMethod(typeof(Web.App\u Start.NinjectWebCommon),“Start”)]
[程序集:WebActivator.ApplicationShutdownMethodAttribute(typeof(Web.App_Start.NinjectWebCommon),“Stop”)]
名称空间Web.App\u开始
{
公共静态类NinjectWebCommon
{
私有静态只读引导程序Bootstrapper=new Bootstrapper();
///
///启动应用程序
///
公共静态void Start()
{
RegisterModule(typeof(OnePerRequestHttpModule));
RegisterModule(typeof(NinjectHttpModule));
初始化(CreateKernel);
}
///
///停止应用程序。
///
公共静态无效停止()
{
bootstrapper.ShutDown();
}
///
///创建将管理应用程序的内核。
///
///创建的内核。
私有静态IKernel CreateKernel()
{
var kernel=新的标准内核();
kernel.Bind().ToMethod(ctx=>()=>newbootstrapper().kernel);
kernel.Bind().To();
注册服务(内核);
返回内核;
}
///
///在这里加载您的模块或注册您的服务!
///
///内核。
私有静态无效注册服务(IKernel内核)
{
kernel.Bind().To();
}
}
}
您可以按照以下步骤启动并运行WebApi和Ninject:
1创建一个新的WebApi项目
2将字段和构造函数的以下代码添加到默认值控制器:
private IFooService _foo;
public ValuesController(IFooService foo)
{
_foo = foo;
}
3创建接口IFooService和类FooService
public interface IFooService
{
}
public class FooService : IFooService
{
}
4在Nuget Package Manager控制台中运行以下命令以安装Ninject
安装程序包Ninject.MVC3
5在方法RegisterServices(IKernel内核)
这些行将确保您的代码在正确的时间执行。更新:一个超级棒的解释:,现在我不再需要使用
ProductsController():this(new ProductService())
啊,唉,现在这个工作开始了:)
这就是我所做的
我的每个WebApicController都有两个构造函数。例如,对于我的ProductsController,我现在需要定义的构造函数如下所示
public class ProductsController : ApiController
{
private readonly IProductService _productService;
public ProductsController(): this(new ProductService())
{
}
public ProductsController(IFolderService productService)
{
this._polderService = productService;
}
public List<Product> GetProducts()
{
return _productService.GetAllProducts();
}
}
公共类产品控制器:ApiController
{
私有只读IPProductService\u productService;
公共产品控制器():此(新产品服务())
{
}
公共产品控制器(IFolderService productService)
{
这._polderService=productService;
}
公共列表产品()
{
return_productService.GetAllProducts();
}
}
:)那么“这不起作用”的确切含义是什么?您看到了什么错误消息?啊,对不起,我错过了!若我添加了这个构造函数,并没有调用WebAPI方法,我通过使用断点确认了这一点,否则它会调用。浏览器显示一个xml错误,该错误读取
发生错误。
您可以发布所有的Ninject配置代码吗?Web API有自己的依赖项注入挂钩。如果您还没有将ninject配置为同时解析web api控制器,那么这可能就是问题所在-当您调用web api操作时,ninject当前不参与。MarkSeemann在他的网站上举了一个例子:这不是真正的依赖注入。WebApi和Ninject可以完美地协同工作。如果您按照我在回答中提到的步骤操作,它应该会起作用。正如我之前所说,@WouterdeKort您的解决方案对@WouterdeKort的meAgree不起作用,这不是依赖注入
[assembly: WebActivator.PreApplicationStartMethod(typeof(WebApiNinjectTest.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(WebApiNinjectTest.App_Start.NinjectWebCommon), "Stop")]
public class ProductsController : ApiController
{
private readonly IProductService _productService;
public ProductsController(): this(new ProductService())
{
}
public ProductsController(IFolderService productService)
{
this._polderService = productService;
}
public List<Product> GetProducts()
{
return _productService.GetAllProducts();
}
}