1

我是 ASP.NET Web API 的新手。

我已使用本教程将我的 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>();            
        }        
    }
}
4

2 回答 2

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 控制台中运行以下命令以安装 Ninject

安装包 Ninject.MVC3

5 将以下绑定添加到 App_Start\NinjectWebCommon.cs 方法中RegisterServices(IKernel kernel)

  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")]

这些行将确保您的代码在正确的时间执行。

于 2012-10-02T10:22:50.160 回答
-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();
    }
}

:)

于 2012-10-03T07:08:30.560 回答