【问题标题】:MVC3, Ninject and Ninject.MVC3 problemMVC3、Ninject 和 Ninject.MVC3 问题
【发布时间】:2011-07-09 03:50:30
【问题描述】:

我刚开始将 Ninject 与 MVC3 一起使用,所以这是我的问题: - 我从 Nuget 安装了 Ninject 2.2.1.4 和 Ninject.MVC3 2.2.2.0 - 在我的 WebUI(MVC3 项目)中:

Global.asax.cs

public class MvcApplication : NinjectHttpApplication
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }

    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 = UrlParameter.Optional } // Parameter defaults
        );

    }

    protected override void OnApplicationStarted()
    {
        base.OnApplicationStarted();

        AreaRegistration.RegisterAllAreas();
        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }

    protected override IKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        kernel.Load(Assembly.GetExecutingAssembly());
        return kernel;
    }


}
  • 在我的域(类项目)中,我有我的 LinQ to SQL 数据上下文,我想在我的 WebUI 中使用我的 Web.Config 中的连接字符串加载上下文,所以我必须传递构造函数参数,我也有我的域项目中的一些服务

    public class LotteryDataService
    {
        LinQ.WebDataContext _context;
    
        public LotteryDataService(LinQ.WebDataContext context)
        {
            _context = context;
        }
    
        public IEnumerable<LinQ.LotteryData> Get()
        {
            return _context.LotteryDatas.Take(10);
        }
    }
    

如何使用构造函数参数(这里是连接字符串)将数据上下文与 Ninject 绑定?

【问题讨论】:

    标签: asp.net-mvc-3 dependency-injection ninject


    【解决方案1】:

    这是传递构造函数参数的方式。 Ninject 将解析与指定构造函数参数匹配的构造函数。

    public class DataModule : NinjectModule
    {
        public override void Load()
        {
            string connectionString = "...";
            Bind<WebDataContext>().ToSelf()
                .WithConstructorArgument("connection", connectionString);
        }
    }
    

    .WithConstructorArgument() 的第一个参数应该是构造函数参数的名称。这是基类中的fileOrServerOrConnection,但派生类中是connection

    【讨论】:

    • 非常感谢,为我节省了很多时间 :)
    • 你忘记在 CreateKernel 方法中加载 Global.ascx.cs 中的所有模块 lol
    【解决方案2】:

    下面的代码快照可能会有所帮助。希望它能提供更大的灵活性!

    public class MvcModule : NinjectModule
    {
        //Bind the default connection string
        public void BindDataContext()
        {
            ConstructorArgument parameter = new ConstructorArgument("connectionString", "[Config Value]");
            Bind<DataContext>().ToSelf().InRequestScope().WithParameter(parameter);
        }
        public override void Load()
        {
             BindDataContext();
             Bind(typeof(IRepository<>)).To(typeof(EntityRepository<>)).InRequestScope();
             ........
        }
        //Re-Bind the connection string (in case of multi-tenant architecture)
        public void ReBindDataContext(string cn)
        {
             ConstructorArgument parameter = new ConstructorArgument("connectionString", cn);
             Rebind<DataContext>().ToSelf().InRequestScope().WithParameter(parameter);
        }
        //Re-Bind the connection string (in case of multi-tenant architecture)
        public static void ReBindDataContext(IKernal kernel,string cn)
        {
             IEnumerable<INinjectModule> ml = kernel.GetModules();
             var myModule = ml.Where(i => i.Name.ToLowerInvariant().Contains("mvcmodule")).Select(i => i).Take(1);
             MvcModule mm = myModule.ToList()[0] as MvcModule ;
             mm.ReBindDataContext(cn);
        }
        //Return the module, for further modification like connection string
        public static MvcModule GetModule(IKernal kernel)
        {
            IEnumerable<INinjectModule> ml = kernel.GetModules();
            var myModule = ml.Where(i => i.Name.ToLowerInvariant().Contains("mvcmodule")).Select(i => i).Take(1);
            MvcModule mm = myModule.ToList()[0] as MvcModule ;
            return mm;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多