1.Ninject用来解耦程序;即对接口编程,而不是对实现类编程;理解:BLL对IDAL编程,对应的是调用多种数据实现的DAL,DAL可以是SqlServer的,可以是Oracle,或其他数据媒介;

2.CodeFirst是EF的一种;用来实现数据持久化,可以理解为第一点中的DAL层或repository层的数据来源;

3.主要代码

model层

namespace MVCCodeFirstNinject.Model
{
public class EntityBase<TId>
{
public TId ID { get; set; }
}
}

  

namespace MVCCodeFirstNinject.Model
{
public class Product : EntityBase<int>
{
public string Name { get; set; }
public decimal Price { get; set; }
}
}

irepository层,我把仓储的接口层独立出来,看到很多人都是放到domain中的;

namespace MVCCodeFirstNinject.IRepository
{
public interface IProductRepository
{
IQueryable<Product> Products { get; }
}
}

  这里返回IQueryable,理解:IQueryable处理sql时会加入where,而IEumerable是把所有数据读取到内存再进行where过滤,当然IQueryable在处理linq转换where时会消耗性能;因此:IQueryable用于数据多,反之IEumerable;

EF的CodeFirst独立出来,做数据层:CodeFirst需要添加EF引用;

namespace MVCCodeFirstNinject.CodeFirst
{
public class EFDbContext : DbContext
{
public DbSet<Product> Products { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Product>().ToTable("tProduct");//指定表名
//设置对应到数据库的字段名
modelBuilder.Entity<Product>()
.Property(p => p.ID)
.HasColumnName("ProductID")
.HasColumnType("int");
}
}
}

  还需要在web.config增加连接串:

<connectionStrings>
<add name="EFDbContext" connectionString="Data Source=.;Initial Catalog=Product;User ID=sa;Password=sa" providerName="System.Data.SqlClient" />
</connectionStrings>

  如上两步就实现了CodeFirst的数据读取;

增加repository层,这里理解成:多种数据来源定义不同的仓储,比如现在是用CodeFirst的(即这里调用CodeFirst实现数据持久化),以后程序拓展,可以拓展成其他层,比如三层用SqlServer的DAL,或Oracle;

namespace MVCCodeFirstNinject.Repository
{
public class ProductRepository : IProductRepository
{
private EFDbContext ef = new EFDbContext(); public IQueryable<Product> Products
{
get { return ef.Products; }
}
}
}

接着是基础设备,定义mvc接入的开头工厂类,这里定义在infrastructure层:

namespace MVCCodeFirstNinject.Infrastructure
{
//基础设施层:指定mvc映射的Ninject工厂模式
//作用就是用mvc模式调用Ninject来映射控制器中应该使用的某个视图,
//因此如若是多视图,应该是该视图下包含多个子视图,以此来达到一个页面显示多种model数据
public class NinjectControllerFactory : DefaultControllerFactory
{
private IKernel ik; public NinjectControllerFactory()
{
ik = new StandardKernel();
AddNinjectIoc();
} private void AddNinjectIoc()
{
ik.Bind<IProductRepository>().To<ProductRepository>();
} protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
//ik.Get 得到依赖注入的接口对应的类
return controllerType == null ? null : (IController)ik.Get(controllerType);
}
}
}

  这里包括了Ninject的使用,即先定义ik,然后用bind指定映射;最后是重新mvc的接入方法,用get方法来返回所要使用的类,即仓储中的IRepository类;

最后是mvc,在mvc中加入Ninject的工厂模式注册:

namespace MVCCodeFirstNinject.Web
{
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes); //加入Ioc的调用
ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());
}
}
}

接着添加mvc控制器:(mvc就是添加控制器,然后在控制器方法中添加对应的视图)

namespace MVCCodeFirstNinject.Web.Controllers
{
public class ProductController : Controller
{
private IProductRepository _repository; //
// GET: /Product/
public ViewResult Index()
{
return View(_repository.Products);
} public ProductController(IProductRepository repository)
{
_repository = repository;
}
}
}

  控制器的构造函数,引入了对应的IProductRepository的初始化(映射来源于基础设备层的工厂类,注意该类的继承和重新),得到了对应的数据层读取(这里即:对接口编程);

最后是添加视图,即可读取数据了:

@model IQueryable<MVCCodeFirstNinject.Model.Product>
@{
ViewBag.Title = "Index";
}
@{
string str = "";
foreach (var p in Model)
{
str += "<p>" + p.Name + "</p>";
}
}
@str

  

mvc学习总结-使用Ninject和CodeFirst的更多相关文章

  1. MVC学习系列4--@helper辅助方法和用户自定义HTML方法

    在HTML Helper,帮助类的帮助下,我们可以动态的创建HTML控件.HTML帮助类是在视图中,用来呈现HTML内容的.HTML帮助类是一个方法,它返回的是string类型的值. HTML帮助类, ...

  2. ASP.NET MVC学前篇之Ninject的初步了解

    ASP.NET MVC学前篇之Ninject的初步了解 1.介绍 废话几句,Ninject是一种轻量级的.基础.NET的一个开源IoC框架,在对于MVC框架的学习中会用到IoC框架的,因为这种IoC开 ...

  3. Spring MVC 学习 -- 创建过程

    Spring MVC 学习 -- 创建过程 Spring MVC我们使用的时候会在web.xml中配置 <servlet> <servlet-name>SpringMVC< ...

  4. 前端MVC学习总结——AngularJS验证、过滤器

    前端MVC学习总结--AngularJS验证.过滤器 目录 一.验证 二.过滤器 2.1.内置过滤器 2.1.1.在模板中使用过滤器 2.1.2.在脚本中调用过滤函数 2.2.自定义过滤器 三.指令( ...

  5. 《Spring MVC学习指南》怎么样?答:书名具有很大的欺骗性

    2016年6月21日 最近,因为工作需要,我从网上买了一本<Spring MVC学习指南>,ISBN编号: 978-7-115-38639-7,定价:49.00元.此书是[美]Paul D ...

  6. PHP实例开发(3)PHP中MVC学习之ThinkPHP

    PHP中MVC学习之ThinkPHP 1.什么是MVC MVC本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器.使用MVC的目的是将M和V的实现代码分离 MVC是一个设 ...

  7. Asp.net MVC 学习系列(一)序

    题外话 公司本月开始提供早餐服务,2块天一餐,包括粥,两个包(听说是利口福供应的),一个鸡蛋.良心企业.公司原本有一个内部订餐系统,用Delphi开发的,开发的人早就走光了,也没有留下什么文档,现在项 ...

  8. MVC学习(四)几种分页的实现(3)

    在这篇MVC学习(四)几种分页的实现(2)博文中,根据URL中传入的两个参数(页码数,首页.上一页.下一页.末页的标记符)来获得对应的分页数据, 只是传入的参数太多,调用起来不太方便(标记符不能够写错 ...

  9. ASP.NET MVC学习之Ajax(完结)

    一.前言 通过上面的一番学习,大家一定收获不少.但是总归会有一个结束的时候,但是这个结束也意味着新的开始. 如果你是从事ASP.NET开发,并且也使用了第三方控件,那么一定会觉得ASP.NET开发aj ...

随机推荐

  1. windows下配置Nginx+Mysql+Php7

    环境:Windows10 mysql-5.6.24-win32解压缩版    nginx-1.8.0    php7 1.Mysql安装 下载压缩文件之后解压缩至相应目录(我的目录是G:\wnmp\m ...

  2. 重读LPTHW-Lesson18-21 函数

    1.def 定义函数,选取合适的函数名,原则是易于理解.阅读.函数名格式与变量命名格式相同,以字母开始,可以包含字母.数字.下划线.函数命名后,把参数放在()中,可以无参数.然后:结束函数命名,开始函 ...

  3. javascript获取页面文档内容

    <html> <head> <title>JavaScript基础</title> </head> <body> <p&g ...

  4. Mysql bigint 类型转为datetime

    最近在使用quartz,在mysql中其数据库表中的时间都是使用bigint类型存储的,要想使其查询结果显示为yyyy-mm-dd hh:MM:ss的格式需要使用 from_unixtime()函数, ...

  5. 为什么选择使用 Dropbox 而不是其他品牌同步工具(不要加上多余的功能,要极致和专注)

    作者:吴锋链接:http://www.zhihu.com/question/19646859/answer/14707821来源:知乎著作权归作者所有,转载请联系作者获得授权. 窃以为楼主的问题,准确 ...

  6. JavaScript 之 Cookie

    JavaScript是运行在客户端的脚本,因此一般是不能够设置Session的,因为Session是运行在服务器端的. 而cookie是运行在客户端的,所以可以用JS来设置cookie. 假设有这样一 ...

  7. bzoj3407 [Usaco2009 Oct]Bessie's Weight Problem 贝茜的体重问题

    Description     贝茜像她的诸多姊妹一样,因为从约翰的草地吃了太多美味的草而长出了太多的赘肉.所以约翰将她置于一个及其严格的节食计划之中.她每天不能吃多过H(5≤日≤45000)公斤的干 ...

  8. WPFS数据绑定(要是后台类对象的属性值发生改变,通知在“client界面与之绑定的控件值”也发生改变须要实现INotitypropertyChanged接口)

    WPFS数据绑定(要是后台类对象的属性值发生改变,通知在"client界面与之绑定的控件值"也发生改变须要实现INotitypropertyChanged接口) MainWindo ...

  9. 关于VS 2010 RDLC 报表的详细使用说明

    各位技术屌丝们好, 之前我用了很长一段时间通过不断的研究揣摩,终于把RDLC报表给搞透了,今天跟大家做个总结,希望能够帮助到大家. 需求分析 我想把datagridview 中的数据打印出来. 首先 ...

  10. C#自定义控件在添加引用后不显示在工具箱的解决方法

    先说一些背景: 在开发C#项目时,发现很多控件存在复用的情况,控件的属性都是要设置成一样的,我就想,能不能设置一个类来存放这个控件,这样我每次用的时候直接加一些特殊的操作就可以了,不需要再次设置控件属 ...