zoukankan      html  css  js  c++  java
  • asp.net MVC4, Ninject automating

    在MVC4下, 很多人都在使用Ninject来实现DI。 

    在这里(http://q.cnblogs.com/q/37471/) , 老大提到一个:

    [assembly: PreApplicationStartMethod(typeof(BootStrapper.Initializer), "Initialize")]

    但是我至今都没搞定那个BootStrapper是怎么来的。引用了哪些DDL?

    研究了2个小时,搞定如下:

    1. 首先需要添加如下的引用: (添加到WebUI项目下,DAL项目无需添加)

    1) BootStrapper.Ninject

    2) Ninject.

    使用nuget添加,其他关联的引用,会自动添加上来。

    2. WebUI下,创建NinjectDependencyResolver.cs

    内容如下:

    public class NinjectDependencyResolver : IDependencyResolver
        {
            private IKernel ninjectKernel;
            public NinjectDependencyResolver()
            {
                ninjectKernel = (IKernel)Bootstrapper.Container;
            }
     
            public object GetService(Type serviceType)
            {
                return ninjectKernel.TryGet(serviceType);
            }
     
            public IEnumerable<object> GetServices(Type serviceType)
            {
                return ninjectKernel.GetAll(serviceType);
            }
        }

    3. Controller使用构造函数注入.

    public class UserController : Controller
        {
            <strong>private IUserRepository repository;
     
            public UserController(IUserRepository repo)
            {
                repository = repo;
            }</strong>
     
            //
            // GET: /User/
     
            public ViewResult Index()
            {
                return View(repository.AllUsers());
            }
        }

    如果使用属性注入:

    public class UserController : Controller
        {
            [Inject]
            public IUserRepository Repository{get;set;}
     
            //
            // GET: /User/
     
            public ViewResult Index()
            {
                return View(Repository.AllUsers());
            }
        }

    这个看起来更简洁。

      

     

     

    4. 在Global.asax.cs中,修改Application_Start

    protected void Application_Start()
            {
                AreaRegistration.RegisterAllAreas();
     
                RegisterGlobalFilters(GlobalFilters.Filters);
                RegisterRoutes(RouteTable.Routes);
     
                <strong>Bootstrap.Bootstrapper.With.Ninject().UsingAutoRegistration().Start();
     
                Bootstrap.Bootstrapper.IncludingOnly.Assembly(Assembly.GetAssembly(typeof(User)))
                    .Start();
                 
                //ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());
                DependencyResolver.SetResolver(new NinjectDependencyResolver());</strong>
     
                BundleTable.Bundles.RegisterTemplateBundles();
            }

    解释:

    1) Bootstrap.Bootstrapper.With.Ninject().UsingAutoRegistration().Start();  -- 这个主要是自动注册所有的类型,惯例是IMyType的默认实现是MyType(少一个I)。 

    如同:Kernel.Bind<IMyType>().To<MyType>();

    但是在我们的例子里面,不需要写一句:Kernel.Bind<IMyType>().To<MyType>();。 只要保持这个惯例即可。

    2) Bootstrap.Bootstrapper.IncludingOnly.Assembly(Assembly.GetAssembly(typeof(User)))

    .Start();  -- 这个主要是仅仅加载我们的DAL文件, 不用去扫描其他文件,提高效率

    希望给其他人一个更多的参考

    enjoy it,  :)

     

     

      

     
  • 相关阅读:
    正则表达式个人总结(二):正则表达式语法的深入理解第二部分
    正则表达式个人总结(一):正则表达式语法的深入理解第一部分
    JS中的函数(二):函数参数(你可能不知道的参数传递)
    字体属性设置(一):谷歌浏览器12px以下字体的显示;方法和原理
    树莓派4B刷固件卸载ROS包
    Kobuki入门
    locobot快速使用
    AX-18A固件修复失败
    locobot 软件配置
    曾经我认为C语言就是个弟弟
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2555394.html
Copyright © 2011-2022 走看看