1

ASP.NET Web API は初めてです。

このチュートリアルを使用して、ASP.NET MVC 3 プロジェクトを ASP.NET MVC 4 にアップグレードしました。

ここで ninject を使用しようとしていることがわかるように、ここで Web Api を使用しようとしていますが、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 Package 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 ごとに 2 つのコンストラクターがあります。たとえば、私の 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 に答える