ASP MVC 2 Ninject - PullRequest
       2

ASP MVC 2 Ninject

2 голосов
/ 10 февраля 2011

Я пытаюсь немного узнать о MVC и столкнулся с проблемой при использовании Ninject. Я хочу связать репозитории, но продолжаю получать ошибку «Ссылка на объект не установлена ​​на экземпляр объекта».

Я создал свой NinjectControllerFactory:

public class NinjectControllerFactory : DefaultControllerFactory
{
    // A Ninject "kernel" is the thing that can supply object instances
    private IKernel kernel = new StandardKernel(new SportsShopServices());

    // ASP .NET MVC calls this to get the controller for each request
    protected override IController GetControllerInstance(RequestContext context, Type controllerType)
    {
        if (controllerType == null)
            return null;
        return (IController) kernel.Get(controllerType);
    }

    // Configure how abstract sevice types are mapped to concrete implementations
    private class SportsShopServices : NinjectModule
    {
        public override void Load()
        {
            Bind<IProductRepository>().To<SqlProductsRepository>()
                .WithConstructorArgument("connectionString", 
                ConfigurationManager.ConnectionStrings["AppDb"].ConnectionString);
        }
    }
}

и мой контроллер:

public class ProductsController : Controller
{
    private IProductRepository productsRepository;

    // Constructor used with Ninject
    public ProductsController(IProductRepository _productsRepository)
    {
        this.productsRepository = _productsRepository;
    }

    public ViewResult List()
    {
        return View(productsRepository.Products.ToList());
    }
}

Я изменил файл Web.config для предоставления строки подключения к базе данных и метода Application_Start () файла Global.asax, включив в него:

ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());

Я работаю над примером из книги PRO ASP .NET MVC 2, но просто не могу получить эту работу, пытался весь день.

1 Ответ

3 голосов
/ 10 февраля 2011

Если вы просто хотите получить готовую функциональность, то вы делаете слишком много, создавая собственную фабрику контроллеров.

Все, что вам нужно, это следующее в global.asax

public class MvcApplication : NinjectHttpApplication
{      
    protected override IKernel CreateKernel()
    {
        var modules = new INinjectModule[]
        {
            new ServiceModule()
        };

        return new StandardKernel(modules);
    }

    protected override void OnApplicationStarted()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterRoutes(RouteTable.Routes);

        RegisterAllControllersIn(Assembly.GetExecutingAssembly());

    }


    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
        );

    }

    internal class ServiceModule : NinjectModule
    {
        public override void Load()
        {
            // controllers
            this.Bind<Controllers.AccountController>().ToSelf();
            this.Bind<Controllers.HomeController>().ToSelf();

            // Repository
            Bind<Controllers.IFormsAuthentication>().To<Controllers.FormsAuthenticationService>();
            Bind<Controllers.IMembershipService>().To<Controllers.AccountMembershipService>();
        }
    }
}
...