zoukankan      html  css  js  c++  java
  • C# Ninject使用

      Ninject是一个IOC容器,用来解决程序中组件的耦合问题,它的目的在于做到最少配置。简单来讲就是 为我们选择一个想要的类来处理事务。

    百度百科的解释:一个快如闪电、超轻量级的基于.Net平台的依赖注入框架。把应用程序分离成一个个松耦合、高内聚的模块,然后用一种灵活的方式组装起来。

    一、Console项目使用

    参考:[ASP.NET MVC 小牛之路]04 - 依赖注入(DI)和Ninject

    NuGet引入:Ninject

    /// <summary>
    
            /// 1、简单的情况,实现类 没有依赖其他类
    
            /// </summary>
    
            public static  void Simple()
    
            {
    
                //一般的使用情况
    
                Business bus = new Business(new LinqValueCalculator());
    
                decimal result = bus.CalculatStockValue();
    
                Console.WriteLine(result);
    
     
    
                //使用Ninject。。LinqValueCalculator绑定接口
    
                //1、创建一个Ninject内核对象
    
                IKernel ninjectKernel = new StandardKernel();
    
     
    
                //2、将想使用的类型和他的接口进行绑定,告诉Ninject,当接收到一个实现IValueCalculater的请求的时候,
    
                //创建并返回LinqValueCalculator这个类,上面的两个关键字Bind,To可以帮助我们理解他的意思。
    
                ninjectKernel.Bind<IValueCalculater>().To<LinqValueCalculator>();
    
     
    
                //3、用Ninject的Get方法去获取IValueCalculator接口的实现
    
                //Ninject将自动为我们创建LinqValueCalculator类的实例,并返回该实例的引用。
    
                IValueCalculater calcImpl = ninjectKernel.Get<IValueCalculater>();
    
     
    
                //4、创建Business实例并注入依赖(calcImpl)
    
                Business business = new Business(calcImpl);
    
                Console.WriteLine(business.CalculatStockValue());
    
            }
    View Code

    代码:https://github.com/peterYong/SelfTest/tree/master/Ninject.Test

    对于单个简单的DI,用Ninject确实显得麻烦。但如果添加多个复杂点的依赖关系,使用Ninject则可大大提高编码的工作效率

    当我们请求Ninject创建某个类型的实例时,它会检查这个类型和其它类型之间的耦合关系。如果存在依赖关系,那么Ninject会根据依赖处理理它们,并创建所有所需类的实例。

    拓展:

    using (var kernel = new StandardKernel(new BookingServiceNinjectModule(),new CacheNinjectModule()))
                {
                    Client = kernel.Get<IHoldTaskCksService>();
                    Redis = kernel.Get<ICacheManager>(CacheTypeName.Redis);
                }

    二、MVC中使用Ninject

    代码:https://github.com/peterYong/SelfTest/tree/master/Ninject.MVC

    参考:[ASP.NET MVC 小牛之路]05 - 使用 Ninject

      1、创建Controller Factory

    在ASP.NET MVC中,一个客户端请求是在特定Controller的Action中进行处理的。

    默认情况下,ASP.NET MVC使用内置的Controller工厂类 DefaultControllerFactory来创建某个请求对应的Controller实例。

    有时候默认的Controller工厂不能满足我们实际的需求,我们就需要对这种默认行为进行扩展,即创建一个继承自DefaultControllerFactory类的自定义Controller工厂类(NinjectControllerFactory)并重写其中的一些方法。

      2、设置工厂

    Controller工厂类创建好后,我们就需要告诉MVC用我们的NinjectControllerFactory类来创建Controller对象,为此,需在Global.asax文件的Application_Start方法中注册

      3、添加领域模型

    准备数据

      4、添加接口,Repository

    需要一种方式来从数据库中读取Book数据。

    在这我们不防为数据的使用者(这里指Controller)提供一个IBookRepository接口,在这个接口中声明一个IQueryable<Book>类型的属性Books。

    这样,通过该接口使用依赖注入,使用者就可以拿到Books数据集合,而不用关心数据是如何得到的。

    为此,我们在BookShop.Domain工程中添加一个名为 Abstract的文件夹,在该文件夹中添加我们的IBookRepository接口文件,

      5、添加接口实现

    添加一个名为Implement文件夹用于存放具体的类。添加一个实现了IBookRepository接口的BookRepository类来作为我们的Book数据仓储。

      6、添加绑定

    private void AddBindings() {
        ninjectKernel.Bind<IBookRepository>().To<BookRepository>();
    }

      7、添加控制器

    显示列表

      8、添加视图

    显示数据

    更多参考:轻量级IOC框架:Ninject

  • 相关阅读:
    [导入]遍历表单的代码,包括遍历所有,以及遍历特定tag,如input,select lcs
    [导入]JS更改onclick事件 lcs
    [导入]SQLite 字符串长度 函数 lcs
    [导入]休眠 睡眠 区别 lcs
    【转】OpenGL鼠标点击事件
    【转】键盘按键和键盘对应代码表
    【转】vs2010快捷键;sql server 2008快捷;IE9快捷键
    【转】vc6.0移植到VS2010遇到的问题,散分给大家,虽然分不多,各位帮忙
    【转】单缓冲与双缓冲的区别
    【转】光照、材质、纹理的关系
  • 原文地址:https://www.cnblogs.com/peterYong/p/10137987.html
Copyright © 2011-2022 走看看