3

asp.net MVC 4 Web アプリケーションで Ninject を使用する方法を学習しています。コンセプトが正しいかどうかはわかりません。これが私がしたことです。

1) Manage NuGet を使用して Ninject.MVC3 をインストール

2)NinjectWebCommon.csに次のコードを追加しました(このファイルはNugetによってApp_startフォルダーに自動的に追加されました)

  private static void RegisterServices(IKernel kernel)
    {
        **kernel.Bind<IProductRepository>.To<ProductRepository>;**
    }  

3) コントローラーコード

Public Class ProductController
Inherits System.Web.Mvc.Controller

Private _rProduct As IProductRepository
'
' GET: /Product

Sub ProductController(ProductRepository As IProductRepository)
    _rProduct = ProductRepository
End Sub


Function ProductList() As ActionResult
    Return View(_rProduct.GetProducts())
End Function
End Class

4) IProductRepository コード

Public Interface IProductRepository
Function GetProducts() As IQueryable(Of Product)
End Interface

5) ProductRepository コード

Public Class ProductRepository
Implements IProductRepository

Public Function GetProducts() As IQueryable(Of Product) Implements   IProductRepository.GetProducts
    Return (New List(Of Product)() From {
      New Product() With {.Name = "Football", .Price = 25},
        New Product() With {.Name = "Surf board", .Price = 179},
        New Product() With {.Name = "Running shoes", .Price = 95}
    }.AsQueryable())
End Function
End Class

デバッグすると、コントロールは NinjectWebCommon.cs の RegistryServices() のブレークポイントに移動せず、代わりに ProductController の ProductList() に移動します。この時点で _rProduct は Nothing です。何が起こっているのか説明してもらえますか?

ありがとう

4

2 に答える 2

3

このページhttps://github.com/ninject/ninject.web.mvc/wiki/Setting-up-an-MVC3-applicationによると、VB.Net を使用しているため、実行する追加の手順がいくつかあります。

注: VB.NET を使用して MVC3 アプリケーションを開発している場合は、すべてを期待どおりに機能させるための追加の手順がいくつかあります。

編集:これは、私が作業した NinjectWebCommon.vb です。名前空間をメモします (プロジェクト名に「VbMvc」を使用しています)。Global.asax.vb を変更していないため、RegisterServices でブレークポイントがヒットします。

Imports Microsoft.Web.Infrastructure.DynamicModuleHelper
Imports Ninject.Web.Common
Imports Ninject.Web
Imports Ninject
Imports Ninject.Web.Mvc

<Assembly: WebActivator.PreApplicationStartMethod(GetType(VbMvc.App_Start.NinjectWebCommon), "StartNinject")> 
<Assembly: WebActivator.ApplicationShutdownMethodAttribute(GetType(VbMvc.App_Start.NinjectWebCommon), "StopNinject")> 

Namespace VbMvc.App_Start
    Public Module NinjectWebCommon
        Private ReadOnly bootstrapper As New Bootstrapper()

        ''' <summary>
        ''' Starts the application
        ''' </summary>
        Public Sub StartNinject()
            DynamicModuleUtility.RegisterModule(GetType(NinjectHttpModule))
            DynamicModuleUtility.RegisterModule(GetType(OnePerRequestHttpModule))
            bootstrapper.Initialize(AddressOf CreateKernel)
        End Sub

        ''' <summary>
        ''' Stops the application.
        ''' </summary>
        Public Sub StopNinject()
            bootstrapper.ShutDown()
        End Sub

        ''' <summary>
        ''' Creates the kernel that will manage your application.
        ''' </summary>
        ''' <returns>The created kernel.</returns>
        Private Function CreateKernel() As IKernel
            Dim kernel = New StandardKernel()

            kernel.Bind(Of Func(Of IKernel))().ToMethod(Function(ctx) Function() New Bootstrapper().Kernel)
            kernel.Bind(Of IHttpModule)().To(Of HttpApplicationInitializationHttpModule)()

            RegisterServices(kernel)
            Return kernel

        End Function

        ''' <summary>
        ''' Load your modules or register your services here!
        ''' </summary>
        ''' <param name="kernel">The kernel.</param>
        Private Sub RegisterServices(ByVal kernel As IKernel)
            ''kernel.Load(New Bindings.ServiceBindings(), New Bindings.RepositoryBindings(), New Bindings.PresentationBindings(), New Bindings.CrossCuttingBindings())
        End Sub
    End Module
End Namespace
于 2013-10-22T18:08:16.297 に答える
2

すべての http 要求に対してではなく、アプリケーションの開始 (またはリサイクル)時に1 回呼び出されるメソッドによって呼び出されるGlobal.asaxことがわかります。RegisterServices()Application_Start()

デバッグする場合は、こちらApplication_Start()の手順に従ってください。

于 2013-10-22T18:12:33.527 に答える