ASP.NET MVC 5 (七-1)依赖项注入(DI)容器-Ninject

掌握Unity与ASP.NET MVC中的依赖注入实践 依赖注入本质上是一种提供对象依赖关系的技术,对象由外部提供,而不是自身在内部创建。这种做法的好处在于:降低模块间的耦合度:组件间的依赖关系不再由组件自身来管理,而是由外部容器管理,这样组件只需关注自身逻辑。提高组件的可重用性:由于组件不负责依赖的创建,因此它们可以很容易地在不同的环境中重复使用。便于测试和维护:依赖项可以通过接口或抽象类的形式存在,测试时可以通过模拟(Mock)对象来替代实际依赖,从而提高测试的灵活性和可控性。 阅读详情

MVC模式最重要的特性之一是它支持关注分离,应用程序中的组件尽可能独立,而只有很少的几个可控依赖项,在理想的情况下,每个组件都不了解其他组件,而只是通过抽象接口来处理应用程序的其他区域 ,这称为“松耦合”,它使得应用程序更易测试和修改。
依赖项注入可以实现获取实现某接口的对象而不必直接创建该对象,这也称为控制反转。简单理解就是说,为了使得在一个类中不必使用new关键字创建一个对象而可以直接实现一个接口对象,添加一个依赖项注入容器管理应用程序中所有的依赖项。这里采用的方式为**Ninject**DI容器 (Dependncy Injection Container,依赖项注入容器)。也有其他的类似DI工具,比如微软的Unity。

准备示例项目

创建ASP.NET MVC WEB 应用程序, 解决方案命名为EssentialTools,像以前一样,选择Empty(空)模板并选中MVC复选框。然后向解决方案中添加模型、控制器和视图。

添加模型类

  • 在Models文件夹内添加C#类Product,这是之前见过很多次的一个模型类了,它是产品类。编辑为以下内容:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace EssensialTools.Models
    {
        public class Product
        {
            public string Name { get; set; }
            public int IntProductID { get; set; }
            public string Description { get; set; }
            public string Category { get; set; }
            public decimal Price { get; set; }
        }
    }
    
  • 如果想有对一组产品进行一些逻辑上的计算处理的方法,比如求总价、求平均价格等等,我们可以专门建立一个类来处理这些问题。因此又在Models文件夹内添加一个C#类LinqValueCalculator,暂时只让它可以计算一组产品的总价,则修改其内容为:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace EssentialTools.Models
    {
        public class LinqValueCalculator
        {
            public decimal ValueProducts(IEnumerable<Product> products)
            {
               return products.Sum(p => p.Price);
            }
        }
    }
    

    这个类中的ValueProducts方法使用LINQ的Sum方法将传入的一组Product对象的Price属性值相加并返回该值。

  • 最后想建立一个简单的购物车类ShoppingCart,它存储一组产品信息,并可以使用上述ValueProducts计算组的总价。
    编辑其内容为:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace EssentialTools.Models
    {
        public class ShoppingCart
        {
            //定义LinqValueCalculator对象
            private LinqValueCalculator calc;
    
            //重构构造函数
            public ShoppingCart(LinqValueCalculator calcParam)
            {
                calc = calcParam;
            }
            //产品组
            public IEnumerable<Product> Products { get; set; }
            //计算总价
            public decimal CalculateProductTotal()
            {
                return calc.ValueProducts(Products);
            }
        }
    }
    

添加一个控制器

在Controllers文件夹内添加第一个控制器HomeController,编辑为以下内容:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using EssensialTools.Models;

namespace EssensialTools.Controllers
{
    public class HomeController : Controller
    {
    //定义一组产品的信息
        private Product[] products ={
                                       new Product{Name="Kayak",Price=275M,Category="Watersports"},
                                       new Product{Name="Lifejacket",Price=48.95M,Category="Watersports"},
                                       new Product{Name="Soccer",Price=19.50M,Category="Soccer ball"},
                                       new Product{Name="Kayak",Price=34.95M,Category="Corner flag"}
                                   };
        //默认方法            
        public ActionResult Index()
        {
            LinqValueCalculator calc=new LinqValueCalculator();
            //创建购物车对象并给属性Products赋值
            ShoppingCart cart = new ShoppingCart(calc) { Products = products };
            //使用购物车对象调用计算总价的方法
            decimal totalValue = cart.CalculateProductTotal();
            //返回视图,视图的数据模型为decimal
            return View(totalValue);
        }
    }
}

注意增加引用EssensialTools.Models命名空间。

添加视图

在Home控制器的Index方法内右键选择添加视图,并确定视图名称为Index,其他的选项是否选中以不再重要,因为当你把视图文件代码修改为以下内容时,你的选择会随之发生改变。Index.cshtml修改内容为如下:

@model decimal
@{
    Layout = null;
    ViewBag.Title = "Index";
}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Value</title>
</head>
<body>
    <div>
        Total value is $@Model
    </div>
</body>
</html>

该视图的是decimal的强类型视图,Razor表达式@Model这时会代表一个decimal数。
此时就可以运行项目,会得到界面内容如下:
初始界面

使用Ninject

Ninject是依赖项注册容器,那我们为什么需要依赖项注入呢,什么是依赖项呢?依赖项要解决的基本问题是紧耦合类。
简单的来说,上面的几个C#类中,ShoppingCart类中定义了一个LinqValueCalculator类的对象,因此两者之间是紧耦合的,HomeController类中使用new 关键字定义了一个ShoppingCart类的对象和LinqValueCalculator类对象,因此三者是紧耦合的。这意味着如果想替换LinqValueCalculator类,就必须修改与它有紧耦合关系的所有类中找出对它的引用并替换掉,这在大型项目中是非常讨厌的。

使用接口

通过使用C#接口可以解决部分问题。
在Models文件夹内添加一个接口类,添加方式是,右键Models文件夹->添加->新项,选择Interface并命名为IValueCalculator,编辑其内容为如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace EssentialTools.Models
{
        public interface IValueCalculator
        {
            decimal ValueProducts(IEnumerable<Product> products);
        }
}

注意类定义为public型,该接口抽象出计算总价的方法。然后可以在LinqValueCalculator类中实现这一接口,如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;

    namespace EssentialTools.Models
    {
        public class LinqValueCalculator:IValueCalculator
        {
            public decimal ValueProducts(IEnumerable<Product> products)
            {
               return products.Sum(p => p.Price);
            }
        }
    }

这个接口可以让解除ShoppingCart与LinqValueCalculator类之间的紧耦合关系,修改ShoppingCart类内容如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace EssentialTools.Models
{
    public class ShoppingCart
    {
        private IValueCalculator calc;
        public ShoppingCart(IValueCalculator calcParam)
        {
            calc = calcParam;
        }
        public IEnumerable<Product> Products { get; set; }
        public decimal CalculateProductTotal()
        {
            return calc.ValueProducts(Products);
        }
    }
}

此时ShoppingCart与LinqValueCalculator之间的紧耦合关系已经解除,因为在使用ShoppingCart类时只需要为其构造器(构造函数)传递一个IValueCalculator 接口对象就行了。
但C#要求在接口实例化时要指定其实现类,因为要知道想用哪一个实现类(如果有多个类实现了该接口,则在实例化接口时就要指明用的哪一个类实现的),这意味着当在Home控制器中实例化IValueCalculator 对象时需要指明其实现类LinqValueCalculator,此时HomeController与LinqValueCalculator依旧是紧耦合的关系。如HomeController使用IValueCalculator 对象的代码如下:

...
public ActionResult Index()
        {
            IValueCalculator calc = new LinqValueCalculator();
            ShoppingCart cart = new ShoppingCart(calc) { Products = products };
            decimal totalValue = cart.CalculateProductTotal();
            return View(totalValue);
        }
...

要处理这种问题就需要采用Ninject了,来实现对IValueCalculator 接口的实现进行实例化,但它不是在HomeController代码中实现的,否则就没有实际意义了。即HomeController中IValueCalculator calc = new LinqValueCalculator();代码不需要出现在控制其中,就可以知道是使用哪一个实现类实现的本接口。

将Ninject引入Visual Studio项目

使用VS的NuGet集成可以快速简单的实现该目的。打开VS菜单栏的”Tools(工具)“->”Libarary Package Manager“->”Package Manager Console”打开NuGet命令行,或者”Tools(工具)“->”Libarary Package Manager“->”NuGet Manager Console”。
输入如下命令:

Install-Package Ninject -version 3.0.1.10

Install-Package Ninject.Web.Common -version 3.0.0.7

Install-Package Ninject.MVC3 -version 3.0.0.6

等待安装Ninject完成后就可以使用了。

Ninject初步

要得到Ninject的基本功能,要做得工作分为3个阶段,如HomeController的Index方法已修改如下(当然需要添加命名空间using Ninject;):

 public ActionResult Index()
        {
            IKernel ninjectKernel = new StandardKernel();
            ninjectKernel.Bind<IValueCalculator>().To<LinqValueCalculator>();
            IValueCalculator calc = ninjectKernel.Get<IValueCalculator>();
            ShoppingCart cart = new ShoppingCart(calc) { Products = products };
            decimal totalValue = cart.CalculateProductTotal();
            return View(totalValue);
        }

第一个阶段是准备使用Ninject,创建一个Ninject的Kernel(内核)实例,它是一个内核对象,负责解析依赖项并创建新的对象(比如用内核创建一个IValueCalculator 对象,而不再使用new关键字)。

  • 第一阶段的代码为:

    IKernel ninjectKernel = new StandardKernel();
    StandardKernel类是Ninject.IKernel 接口的标准实现类(标准内核),它足以完成我们想要的任何功能要求。

  • 第二阶段则是配置内核,即指定某一个接口是由那个类实现的,代码如下:

    ninjectKernel.Bind().To();
    它说明IValueCalculator接口的依赖项解析应该通过创建LinqValueCalculator类的实例来进行。

  • 第三阶段就是使用Ninject(或者说使用内核)创建(IValueCalculator)对象了。其代码如下:

    IValueCalculator calc = ninjectKernel.Get();

这里已经取得可一些进展,但它依旧没有解决Home控制器和LinqValueCalculator的紧耦合问题,那需要做的就是下一步,依赖项注入了。

建立MVC的依赖项注入

依赖项注入实现的功能就是,将上问Home控制器中的 内核创建、配置和创建对象拿出来放到一个专门的类中,并保证在应用程序运行时依赖项得到解析。

创建依赖项解析器

创建一个单独的类做依赖项的解析器,因此创建一个新的文件夹Infrastructure来存放不适合放在其他文件夹内的类,并创建一个NinjectDependencyResolver类做依赖项解析器。这个类修改为一下内容:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using EssensialTools.Models;
using Ninject.Web.Common;
using Ninject;

namespace EssensialTools.Infrastructure
{
    public class NinjectDependencyResolver : IDependencyResolver
    {
        private IKernel kernel;
        public NinjectDependencyResolver(IKernel kenelParam)
        {
            kernel = kenelParam;
            AddBindings();
        }
        public object GetService(Type serviceType)
        {
            return kernel.TryGet(serviceType);
        }
        public IEnumerable<object> GetServices(Type serviceType)
        {
            return kernel.GetAll(serviceType);
        }
        private void AddBindings()
        {
             kernel.Bind<IValueCalculator>().To<LinqValueCalculator>();
        }
    }
}

NinjectDependencyResolver 类实现了System.Web.Mvc命名空间中的IDependencyResolver接口,MVC框架用它来获取所需的对象。
MVC框架在需要类实例以便对一个传入请求进行服务时,会调用GetService和GetServices方法。依赖性解析器器要做的工作就是创建这一实例。
上述依赖性解析器也是建立Ninject绑定(自定义接口和实现类的绑定)的地方,在AddBindings方法中便实现了IValueCalculator接口和LinqValueCalculator实现类之间关系的配置。

注册依赖项解析器

当然创建完依赖项解析器后还是无法实现功能,因为我们还没有告诉MVC去使用它,那此时该做的事情就是注册该解析器让MVC去使用它。
当我们引入Ninject时它会在App_Start文件夹中创建一个NinjectWebCommon.cs文件,它定义了应用程序启动时会自动调用的一些方法。在NinjectWebCommon类中的RegisterServices方法中我们填写一条语句来创建一个依赖项解析器NinjectDependencyResolver 的实例,并用 System.Web.Mvc.DependencyResolver类定义的SetResolver静态方法将其注册为MVC框架的解析器,如下:

  private static void RegisterServices(IKernel kernel)
        {
            System.Web.Mvc.DependencyResolver.SetResolver(
                new EssentialTools.Infrastructure.NinjectDependencyResolver(kernel));
        }   

直到此时我们已经做得工作有:创建依赖项解析器,并在其中将LinqValueCalculator绑定为IValueCalculator接口的实现类,并且告诉MVC使用我们的依赖项解析器。准备工作已经准备就绪了,看看我们怎样使用费了这么大劲终于完成的依赖项注入吧。

重构Home控制器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using EssentialTools.Models;
using Ninject;

namespace EssentialTools.Controllers
{
    public class HomeController : Controller
    {

        private Product[] products ={
                                       new Product{Name="Kayak",Price=275M,Category="Watersports"},
                                       new Product{Name="Lifejacket",Price=48.95M,Category="Watersports"},
                                       new Product{Name="Soccer",Price=19.50M,Category="Soccer ball"},
                                       new Product{Name="Kayak",Price=34.95M,Category="Corner flag"}
                                   };
        private IValueCalculator calc;                          
        public HomeController(IValueCalculator calcParam,IValueCalculator calc2)
        {
            calc = calcParam;
        }

        public ActionResult Index()
        {
          ShoppingCart cart = new ShoppingCart(calc) { Products = products };
            decimal totalValue = cart.CalculateProductTotal();
            return View(totalValue);
        }
    }
}

所做的更改主要有

  1. 创建HomeController类的带参构造函数,参数类型为接口IValueCalculator ,并在类中创建一个该接口的实例来存储构造函数带来的参数。当MVC创建HomeController实例时发现它带有IValueCalculator 参数便要求解析器解析它,此时我们自定义并注册的解析器就会解析到IValueCalculator 与LinqValueCalculator之间的依赖项关系,此时Ninject就会创建一个LinqValueCalculator对象返回给MVC框架,MVC利用该返回实例创建控制器实例。
  2. 删除Index方法中任何关于Ninject或LinqValueCalculator有关的代码,因为此时已经不需要它们了。
    现在再看Home控制器,会发现它与LinqValueCalculator之间的紧耦合关系已经被打破了。
    这样当需要修改IValueCalculator 的实现类时只需要修改依赖性解析器就可以了。

运行结果向未曾改变一样。
依赖项注入之后的运行结果

Ninject .net mvc DI容器 在学习asp.netmvc的时候要用到一个DI 容器,其非常简单优雅并且很实用。但是中文教程不多。本人在博客园中看到这个文章感觉写的不错就下载整理了一下。希望对大家有所帮助,同时也非常感谢原作者。 立即下载

相关推荐

ASP.NET MVC实现依赖注入的完整过程

前言 在java的spring中有自动注入功能,使得代码变得更加简洁灵活,所以想把这个功能移植到c#中,接下来逐步分析实现过程 1.使用自动注入场景分析 在asp.net mvc中,无论是什么代码逻辑分层,最终的表现层为Controller层,所以我们注入点就是在Controller中,这里我们需要替换默认的ControllerFactory,扫描代码中标记需要注入的对象,进行实例化注入 public class FastControllerFactory : DefaultControllerFactory { public override IController Creat

ASP.NET MVC5 Ninject属性依赖注入

开发ASP.NET MVC项目时,往往涉及大量的层与层之间的依赖关系,如UI层对BLL层的依赖、BLL层对DAL层的依赖。但是层与层之间的直接依赖会导致层与层之间的耦合度过高,这样一来,一旦某一层的某个类需要修改,很有可能会带动依赖这个类的所有类都需要修改,比如BLL层中的有一个UserInfoService类,对DAL层的UserInfoDal直接依赖,则UserInfoDal的修改,会直接导致...

SaiyaYe的博客 862

ClaudeCode 通过 CC Switch 配置 Ollama 本地大模型

本文介绍了如何让Claude Code使用本地免费模型qwen3.5:9b而无需Anthropic API Key的方法。主要内容包括:1)安装Claude Code、CC Switch代理工具和Ollama本地模型运行时;2)配置环境变量和设置文件将请求转发到本地服务;3)详细说明了系统架构和工作原理,展示请求如何从Claude Code经CC Switch代理到Ollama本地模型。该方案通过代理拦截和转发机制,实现了使用免费开源模型替代官方API的功能。

稚枭天卓 3221

ASP.NET MVC 5 (七-2) Ninject进阶

上一篇说了Ninject的初步使用,这里在说一下稍微复杂的使用。创建依赖项链 指定属性和构造器参数 使用条件绑定 设置对象作用域创建依赖项链依赖项是什么呢?简单来说,上一篇当中Home控制器的构造器(构造函数)有IValueCalculator类型参数,那么IValueCalculator就是HomeConreoller的依赖项了。 当我们的依赖项又依赖于其他类型时,即依赖项又有依赖项时,这时Ni

DoongBo的博客 590

Unity跨平台存储避坑指南:persistentDataPath权限真相

Application.persistentDataPath是Unity中用于持久化数据的核心路径,表面提供跨平台抽象,实则底层访问机制因操作系统而异。其原理并非简单路径映射,而是受Android Scoped Storage、iOS Data Protection、Windows组策略及macOS隐私权限等多层安全模型动态约束。技术价值在于保障用户数据长期可靠存储,但若忽略平台差异,极易引发‘本地正常、真机崩溃’‘iOS可存、Android报错’等线上事故。典型应用场景包括游戏存档、离线缓存、自定义资源包

weixin_32073537的博客 350

winedt + miktex + SumatraPDF 搭建latex环境

整个环境包含三部分: - winedt: 前端编辑器 - miktex: 后端编译器 - SumatraPDF: 预览器顺序无关紧要, 不过如果先装miktex的话, 可能会被winedt在安装的时候自动找到路径从而不需要设置.1.安装miktex首先在latex-project官网, 打开”get”后, 有四种平台: Linux, Mac OS, Windows, Online. 我写论文

Iteration makes perfection. 6428

ASP.NET MVC5使用依赖注入实现DI asp.net mvc5使用依赖注入

习惯了Spring的IOC依赖注入开发,现在切换了asp.net开发,也想使用依赖注入,看官方文档 .net也有依赖注入(DI),在 asp.net mvc5中可以使用 Ninject、Autofac等其他第三方组件实现。

半只 1050

无人机航拍实战:如何用Python代码精准计算目标地理坐标(附完整代码)

本文详细介绍了如何利用Python代码实现无人机航拍图像中目标点的精准地理位置计算。通过解析从像素坐标系到WGS84大地坐标系的完整转换链条,结合相机内参、无人机姿态与地球曲率处理,提供了可直接运行的实战代码,并重点分析了地理位置计算中的常见误差来源与应对策略,助力开发者解决实际项目中的定位漂移问题。

hh234的博客 356

【MVC5】使用Autofac实现依赖注入

1.安装Autofac 在Package Manager Console执行如下命令: Install-Package AutofacInstall-Package Autofac.Mvc5 2.追加Model(Models.Movie) using System.Data.Entity; namespace FirstDenpendencyInjection.Model...

weixin_30244889的博客 221

保姆级教程:用达芬奇Configurator配置CAN总线(从DBC导入到Controller设置)

本文详细介绍了使用达芬奇Configurator工具从DBC文件导入到CAN总线控制器设置的全流程配置方法。通过环境准备、CAN控制器模式选择、硬件参数配置、通信参数优化及通信栈集成等关键步骤,帮助开发者高效完成AUTOSAR架构下的CAN总线开发,特别适合汽车电子领域的工程师参考。

weixin_30529023的博客 440

Coze+剪映小助手实战:5分钟搞定视频草稿创建工作流(附常见错误排查)

本文详细介绍了如何利用Coze平台与剪映小助手,通过create_draft接口快速搭建自动化视频草稿创建工作流。文章从核心价值、零基础搭建步骤、运行验证到深度错误排查,手把手教你5分钟内实现视频项目参数预设的标准化与自动化,显著提升短视频创作与团队协作效率。

oil88的博客 548

ASP.NET MVC 的依赖注入,我的整理

最近留意了一下ASP.NET MVC 的依赖注入,也看了不少相关的文章,自己也尝试了两种,分别为 NInject 和 Unity ,在使用的过程中,也渐渐的了解了依赖注入的思想,于是从网上下载了一些相关的代码,直接拿来用之,包括来自微软官方的,也有来自国外牛人博客的,但是使用当中也发生了一些问题,主要问题就是,当客户端请求一个不存在的Controller或者Action的时候(甚至是请求一个不存...

weixin_33725272的博客 335

【科学文献计量】标准参考出版年谱(Standard RPYS)和多维参考出版年谱(Multi RPYS)

@[TOC](标准参考出版年谱(Standard RPYS)和多维参考出版年谱(Multi RPYS)) 1 标准参考出版年谱与多维参考出版年谱 1.1 标准参考出版年谱(Standard RPYS) 标准参考出版年谱(Standard Reference Publication Year Spectroscopy)是由Marx, Bornmann, Barth, and Leydesdorff(2014)和Marx and Bornmann(2014)提出的一种量化历史出版物对研究领域影响的方法。该方法通

lys_828的博客 1103

Ninject依赖项注入容器

最近在看asp.net mvc 和api方面的东西, 遇上个概念 “ 依赖项注入-DI”和“依赖项注入容器-DI容器”,和解耦操作,感觉很有用,所以特意记录一下 使用Ninject来进行操作,所以要先在 vsIDE环境里打开,工具-->库程序包管理器-->程序包管理器控制台 运行 Install-Package Ninject[ -version 3.0.1.10] 我没指定版本,所以自动安装了当前可以安装的最新版3.3.4.0。 自己写的源代码如下, 例子是控制台程序,使用..

u012902518的博客 224

A*寻路算法的最简单通俗讲解

为什么我的眼里常含泪水?因为我有一个算法不会。为了节约点眼泪,今天我们就来介绍著名的A*寻路算法(或简称A*算法)。 Peter Hart, Nils Nilsson 和 Bertram Raphael 在1968年首次提出了著名的A*算法。A*算法其实是Dijkstra最短路径算法的一种扩展。不一样的是,在A*算法中我们需要使用Heuristics 来导引搜索过程,以期达到更好的表现。 ...

白马负金羁 2万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

ASP.NET + MVC5 入门完整教程七 -—-- MVC基本工具(上)

这里主要介绍三类工具:依赖项注入(DI)容器,单元测试框架和模仿工具。1、准备示例项目从创建一个简单的示例开始,名称为"EssentialTools" ,使用MVC空模板,如下所示:创建模型类在 Models 文件夹中添加一个名为 Products.cs 的类,添加内容如下:using System; using System.Collections.Generic; using System.L...

lingshuangcanxue 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IoC之Ninject

一、Ninject安装 Ninject是一个轻量级的开源的DI容器,可以通过Nuget直接安装: 二、Ninject的简单使用 模型代码: //计算器接口 public interface ICalculator { decimal GetTotalValue(IEnumerable<Product> products); } //计...

banyongzhan5405的博客 166

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ASP.NET MVC 3.0学习系列文章--Dependency Resolution in ASP.NET MVC 3.0

最近休假了所以没有及时更新这一系列文章,大家见谅。本来想先写NuGet这部分的,但是我觉得NuGet对于大家来说可以先不用话费太多时间,还是先了解下ASP.NET MVC 3中的DI这部分吧。 ASP.NET MVC 3.0学习系列文章—序 ASP.NET MVC 3.0学习系列文章--Razor and ASP.NET MVC 3.0 ASP.NET MVC 3.0学习系列文章—Con...

weixin_30491641的博客 172

.net mvc

这里主要介绍三类工具之一的 依赖项注入(DI)容器,其他两类 单元测试框架和模仿工具以后介绍。 1、准备示例项目 从创建一个简单的示例开始,名称为"EssentialTools" ,使用MVC空模板,如下所示: 创建模型类 在 Models 文件夹中添加一个名为 Products.cs 的类,添加内容如下: using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace Essent

lbjnwl的博客 144

第 6 章 —— 依赖项注入(DI)容器 —— Ninject

    有些读者只想理解 MVC 框架所提供的特性,而不想介入开发理念与开发方法学。笔者不打算让你改变 —— 这属于个人取向,而且你知道交付优质项目需要的是什么。     建议你至少粗略第看一看本章的内容,以明白哪些是有用的,但如果你不是单元测试型的人,那么可以跳到下一章,看看如何建立一个真实的 MVC 应用程序示例。 6.1 准备示例项目     创建新项目,项目名称为 “Essentia...

weixin_30279671的博客 161

ASP.NET + MVC5 入门完整教程八 -—-- 一个完整的应用程序(上)

SportsStore1、开始创建Visual Studio 解决方案和项目这里打算创建一个解决方案,它含有 3 个项目: 域模型项目、MVC应用程序项目和单元测试项目。首先,创建一个新的 Visual Studio解决方案,其名称为“ Sportsstore",所采用的模板是“Blank Solution(空解决方案)”,该模板位于“ New Project(新项目)”对话框的“ other P...

lingshuangcanxue 1万+

Asp.Net MVC与Web API框架配置核心问题排查指南:路由、控制器、依赖注入与部署

在Web开发中,框架配置是确保应用程序正常运行的基础。以Asp.Net MVC和Web API为例,其配置原理涉及路由映射、控制器激活、依赖注入容器集成等核心机制。理解这些机制的技术价值在于,能够构建稳定、可维护且易于扩展的企业级应用。在实际应用场景中,开发人员常会遇到路由冲突导致API 404、控制器无法被正确发现、依赖注入容器集成不当等问题,尤其是在混合项目部署时,环境差异会进一步放大配置问题。本文聚焦于Asp.Net MVC/Web API框架配置中的典型痛点,系统梳理了路由配置冲突、控制器发现机制、

weixin_34279246的博客 460

ASP.NET MVC使用Ninject

Ninject是一个快如闪电的,轻量级的。。。。。依赖注入框架,呃呃呃,貌似很少用到,Ninject就是一个DI容器,作用是对ASP.NET MVC程序中的组件进行解耦 ,说到解耦其实也有其他的方式可以达到解耦这个目的,比如接口 1 public interface ITest 2 { 3 Decimal ValueProducts(IEnumerable&...

weixin_30734435的博客 167

ASP.NET + MVC5 入门完整教程三 (下) ---MVC 松耦合

建立松耦合组件MVC 模式最重要的特性之一视他支持关注分离,希望应用程序中的组件尽可能独立,只有很少的几个可控依赖项。在理想的情况下,每个组件都不了解其他组件,而只是通过抽象接口来处理应用程序的其他区域,这就称为“松耦合”,它使得的应用程序更易于测试和修改。       举一个简单的例子:假设正在编写一个名称为“MyEmailSender”组件用来发送邮件,笔者会实现一个接口,他定义了发送邮件所需...

lingshuangcanxue 7494

C# 依赖注入

依赖注入 什么是依赖注入 我们创建一个SkiCardController需要应用程序中的一些其他服务才能处理查看,创建和编辑的请求。具体来说,他用SkiCardContext访问数据,用UserManager访问当前用户的信息,用IAuthorizationService检查当前用户是否有权限编辑或者查看所有请求。    如果不用DI或者其他模式,SkiCardController就负责创建这...

weixin_45121123的博客 692
上一篇: ASP.NET MVC 5 (六-2) 使用Razor表达式
下一篇: ASP.NET MVC 5 (七-2) Ninject进阶
DoongBo
博客等级 码龄10年 25粉丝 15原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值