我是ASP.NET Web API的新手。
我已使用this tutorial将ASP.NET MVC 3项目升级到ASP.NET MVC 4。
现在我正在尝试使用Web Api,因为您可以看到我在这里尝试使用ninject,但是当我以这种方式声明ProductsController
构造函数时,这不起作用。
public class ProductsController : ApiController
{
private readonly IProductService _productService;
public ProductsController(IProductService productService)
{
this._productService = productService;
}
public List<Product> GetProducts()
{
return _productService.GetAllProducts();
}
}
请帮我解决这个问题。
如果我添加这个构造函数没有调用Web Api方法,我通过使用断点来确认这一点,否则会调用它。 浏览器显示xml错误,该错误读取
<Error><Message>An error has occurred.</Message></Error>
我的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>();
}
}
}
答案 0 :(得分:1)
您可以按照以下步骤启动并运行WebApi和Ninject:
1创建一个新的WebApi项目 2将字段和构造函数的以下代码添加到默认的ValuesController:
private IFooService _foo;
public ValuesController(IFooService foo)
{
_foo = foo;
}
3创建一个接口IFooService和一个类FooService
public interface IFooService
{
}
public class FooService : IFooService
{
}
4在Nuget Packag Manager Console中运行以下命令以安装Ninject
安装包Ninject.MVC3
5在方法RegisterServices(IKernel kernel)
中将以下绑定添加到App_Start \ NinjectWebCommon.cs
kernel.Bind<IFooService>().To<FooService>().InRequestScope();
在您的代码中,您可能没有在适当的时候调用NInject配置。当您使用Nuget包时,您将在Ninject文件的顶部获得以下行:
[assembly: WebActivator.PreApplicationStartMethod(typeof(WebApiNinjectTest.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(WebApiNinjectTest.App_Start.NinjectWebCommon), "Stop")]
这些行将确保您的代码在正确的时间执行。
答案 1 :(得分:-9)
更新:一个非常棒的解释:http://www.strathweb.com/2012/05/using-ninject-with-the-latest-asp-net-web-api-source/,现在我不再需要使用ProductsController(): this(new ProductService())
。
唉,阿拉斯现在正在努力:)
这就是我做的......
我的每个WebApiController都有两个构造函数。例如,对于我的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();
}
}
:)