asp.net-mvc - ASP MVC 2 注入(inject)

标签 asp.net-mvc ninject

我正在尝试了解一些有关 MVC 的知识,但在使用 Ninject 时遇到了问题。我想绑定(bind)存储库,但不断收到“对象引用未设置到对象实例”错误。

我已经创建了我的 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);
        }
    }
}

和我的 Controller :

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 文件以提供数据库连接字符串和 Global.asax 文件 Application_Start() 方法以包括:

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

我正在研究 PRO ASP .NET MVC 2 书中的一个示例,但一整天都在尝试,但就是无法完成这项工作。

最佳答案

如果您只想要开箱即用的 ninject 功能,那么创建自己的 Controller 工厂就太过分了。

您所需要的只是 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>();
        }
    }
}

关于asp.net-mvc - ASP MVC 2 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4959330/

相关文章:

c# - 如何在让 Designer 满意的同时将依赖注入(inject)应用于 UserControl View ?

c# - 解析接口(interface)时,Ninject 未解析为已配置的单例

c# - 使用 Ninject 时如何模拟通用 Get 方法并使用 SetUp 方法填充模拟数据库?

c# - 没有可用的匹配绑定(bind),并且该类型在 Ninject 中不可自绑定(bind)

asp.net-mvc - Visual Studio 2010 是否支持 MVC 5?

asp.net - Orchard 是否支持某种形式的配置转换?

asp.net-mvc - Razor View 语法无法识别 HTML 属性中的 "@"

asp.net-mvc - ASP.NET MVC - 下拉列表选择 - 部分 View 和模型绑定(bind)

c# - 创建一个列表来显示字典的内容?

ninject - 运行时绑定(bind) : A simple task runner with ninject?