문제

처음으로 Ninject를 설정하려고합니다. Irepository 인터페이스와 저장소 구현이 있습니다. ASP.NET MVC를 사용하고 있으며 다음과 같은 구현을 주입하려고합니다.

public class HomeController : Controller
{
    [Inject] public IRepository<BlogPost> _repo { get; set; }

    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";

        var b = new BlogPost
                    {
                        Title = "My First Blog Post!",
                        PostedDate = DateTime.Now,
                        Content = "Some text"
                    };

        _repo.Insert(b);

        return View();
    }

    // ... etc
}

그리고 여기 Global.asax가 있습니다.

public class MvcApplication : NinjectHttpApplication
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

    }

    protected override void OnApplicationStarted()
    {
        RegisterRoutes(RouteTable.Routes);
    }

    protected override IKernel CreateKernel()
    {
        IKernel kernel = new StandardKernel(new BaseModule());
        return (kernel);
    }
}

그리고 여기에 Basemodule 수업이 있습니다.

   public class BaseModule : StandardModule
    {
        public override void Load()
        {
            Bind<IRepository<BlogPost>>().To<Repository<BlogPost>>();
        }
    }

그러나 index () action을 탐색하면 _repo.insert (b)를 사용할 때 "객체 참조가 객체 인스턴스로 설정되지 않음"을 얻습니다. 내가 무엇을 떠나고 있습니까?

도움이 되었습니까?

해결책

Ninject 1.0은 상자에 MVC 지원이 없었습니다. 웹 주위에 Ninject 1.0을 흩어져있는 MVC를 사용하는 다양한 방법이 있습니다.

MVC 지원이 포함 된 Ninject Trunk에서 최신 코드를 얻는 것이 좋습니다. 그런 다음 다음을 응용 프로그램의 시작점으로 사용하십시오.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using DemoApp.Models;
using Ninject.Core;
using Ninject.Framework.Mvc;

namespace DemoApp
{
    public class MvcApplication : NinjectHttpApplication
    {
        protected override void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default",                                              // Route name
                "{controller}/{action}/{id}",                           // URL with parameters
                new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
            );
        }

        protected override IKernel CreateKernel()
        {
            return new StandardKernel(new BaseModule(), new AutoControllerModule(Assembly.GetExecutingAssembly()));
        }
    }
}

원래 구현과 비교하여 강조해야 할 몇 가지 사항이 있습니다 ...

  • Ninject가 있습니다 구현 이름 ninjecthttpapplication- 하나는 ninject.framework.web에 있고 ninject.framework.mvc에 있습니다. 나중에 Protected RegisterRoutes () 메소드가 포함되어 있으므로 전자를 사용하는 것으로 보입니다.
  • 컨트롤러 빌더를 사용하여 수행되는 컨트롤러 생성에 고리를주는 방법이 필요합니다. ninject.framework.mvc.ninjecthttpapplication은 NinjectControllerFactory를 등록합니다. Ninject 1.0을 사용하는 경우 직접 공급해야합니다.
  • 컨트롤러를 컨테이너에 등록해야합니다. 수동으로 수행 할 수는 있지만 최신 코드를 사용하면 컨트롤러를 자동으로 등록하는 AutoControllerModule이 제공합니다!

다른 팁

추가해야합니다 AutocontrollerModule 커널을 만들 때 지정할 수있는 모듈 목록에 다음과 같이 표시하십시오.

protected override IKernel CreateKernel()
{
    IKernel kernel = new StandardKernel(
                         new BaseModule(), 
                         new AutoControllerModule(Assembly.GetExecutingAssembly())
                     );
    return (kernel);
}

그만큼 AutocontrollerModule Ninject 1.X의 MVC 지원의 일부입니다. MVC 컨트롤러 클래스를 위해 생성자에게 제공하는 어셈블리를 스캔하고 자동 바인드입니다. 코드에서는 저장소를 올바르게 바인딩했지만 Ninject는 컨트롤러를 활성화하는 것을 담당하지 않습니다. 저장소를 귀하의 인스턴스에 주입하려면 홈 컨트롤러 클래스, Ninject는 컨트롤러를 작성하고 활성화해야합니다. 없이 AutocontrollerModule, MVC는 컨트롤러 생성을 담당하고 있습니다. 따라서 Ninject는 결코 회원을 주사 할 기회를 얻지 못합니다. Ninject가 컨트롤러를 생성하고 활성화하는 것을 담당하면 주입이 예상대로 발생합니다.

생각하십시오 AutocontrollerModule 모든 컨트롤러를 찾고 이와 같은 코드를 생성 할 때 (예로서 사용 된 HomeController) :

Bind<HomeController>.ToSelf();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top