ASP MVC 2 Ninject

时间:2011-02-10 15:51:28

标签: asp.net-mvc ninject

我正在尝试学习一些关于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文件以提供db连接字符串和Global.asax文件Application_Start()方法以包含:

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

我正在研究PRO ASP .NET MVC 2中的一个例子,但是一直在尝试这项工作。

1 个答案:

答案 0 :(得分:3)

如果您只是想要开箱即用的ninject功能,那么创建自己的控制器工厂就会做得太多。

你需要的是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>();
        }
    }
}
相关问题