体验ASP.NET MVC5之一

玩了一天,参考了Adam Freeman的书,总结一下,以备后来查看。

1、创建一个ASP.NET Web Application ——MVC 选择空模板

MVC  三个文件夹功能很清晰  Models Views Controllers

2、使用NuGet安装bootstrap,EntityFramework,Ninject......

NuGet很好用,可以可视化操作,比maven方便,下载速度也很快。

bootstrap 用于前端 ,EF是.net的ORM(对象关系映射),Ninject是一个依赖注入DI容器


3、体验EF的Code-First

A  创建实体类

    这里比较下Entity和Model

Entity 和数据库对应的实体类

Model是MVC中一个概念,可能不和Entity一一对应,因为展示在View层中数据可能是一个Entity的精简,也可能是多个Entity的组合。一句话概括:Model是一个高度优化组合或者精简后的一个用于在View层展示数据的对象

Model可以是多个Entity的集合

using System;

namespace WXPlatform.Entities
{
    public class Student
    {
        public int Id { get; set; }
        public string StudentId { get; set; }
        public string ClassId { get; set; }
        public string CollegeId { get; set; }
        public string IdentityId { get; set; }
        public string LoginName { get; set; }
        public string RealName { get; set; }
        public string NickName { get; set; }
        public string Password { get; set; }
        public string PhoneNumber { get; set; }
        public DateTime LastVisit { get; set; }
        public int VisitCount { get; set; }
        public string Address { get; set; }
        public string Authority { get; set; }
    }
}


B  创建上下文 EFDbContext.cs  这个文件用以关联Entity和DB

  

using System.Data.Entity;
using WXPlatform.Entities;


namespace WXPlatform.Concrete
{
    public class EFDbContext : DbContext
    {
        public DbSet<Student> Student { get; set; }
    }
}


C Web.config

注意这里的name和上面的上下文的name

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


D 接口来一个

书上把抽象都放在Abstract文件夹,把实现都放在Concrete文件夹

using System.Collections.Generic;
using WXPlatform.Entities;

namespace WXPlatform.Abstract
{
    public interface IStudentRepository
    {
        IEnumerable<Student> Student { get; }
    }
}


E 创建存储库类

using System.Collections.Generic;
using WXPlatform.Entities;
using WXPlatform.Abstract;

namespace WXPlatform.Concrete
{
    public class EFStudentRepository : IStudentRepository
    {
        private EFDbContext context = new EFDbContext();
        public IEnumerable<Student> Student
        {
            get { return context.Student; }
        }
    }
}


F  程序包管理器控制台   指令Enable-Migrations  会生成 Migrations\Configuration.cs

里面有一句改自动true  AutomaticMigrationsEnabled = true;

数据库中会生成一个__MigrationHistory表和Entity对应的数据库,表的名字加s,比如Student表名为Students

Enable-Migrations还有个强制参数 -force

如果数据库结构被修改报错了怎么办?---------------直接删掉__MigrationHistory表

Code-First

所有string生成的都是 NVARCHAR (MAX) NULL

      DateTime 类型     DATETIME       NOT NULL,

      INT 类型           NOT NULL,

     int Id  会被转为          INT            IDENTITY (1, 1) NOT NULL,

   都可以修改的

4、Ninject

A  NinjectDependencyResolver.cs

关键绑定的句子:kernel.Bind<IStudentRepository>().To<EFStudentRepository>();

书上也有模仿存储库的例子,用的是Moq库

Mock<IStudentRepository> mock=new Mock<IStudentRepository>();

mock.Setup(m=>m.Students).Returns(new List<Student>{

new Student {RealName="",NickName=""....... },

new Student {RealName="",NickName=""....... }

});

using System;
using System.Collections.Generic;
using System.Web.Mvc;
using Ninject;
using WXPlatform.Abstract;
using WXPlatform.Concrete;

namespace WXPlatform.Infrastructure
{
    public class NinjectDependencyResolver : IDependencyResolver
    {
        private IKernel kernel;

        public NinjectDependencyResolver(IKernel kernelParam)
        {
            kernel = kernelParam;
            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<IStudentRepository>().To<EFStudentRepository>();
        }
    }
}


B  NuGet装了

  • Ninject
  • Ninject.Web.Common
  • Ninject.Web.Mvc

居然App_Start里没有 Ninject.Web.Common.cs文件

后来补装了Ninject.Web.WebApi.WebHost 有了Ninject.Web.Common.cs里

/// <summary>
        /// Load your modules or register your services here!
        /// </summary>
        /// <param name="kernel">The kernel.</param>
        private static void RegisterServices(IKernel kernel)
        {
            System.Web.Mvc.DependencyResolver.SetResolver(new WXPlatform.Infrastructure.NinjectDependencyResolver(kernel));
        }     


5、Controller   & View

HomeController.cs

using System.Web.Mvc;
using WXPlatform.Abstract;

namespace WXPlatform.Controllers
{
    public class HomeController : Controller
    {
        private IGradeRepository repository;

        public HomeController(IGradeRepository GradeRepository)
        {
            this.repository = GradeRepository;
        }

        public ViewResult Index()
        {
            return View(repository.Grade);
        }
    }
}


Index.cshtml

@using WXPlatform.Entities;
@model IEnumerable<Student>

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    @foreach (var p in Model)
    {
        <div>
            <h1>@p.RealName</h1>
        </div>
    }
</body>
</html>



猜你喜欢

转载自blog.csdn.net/peterzhuge/article/details/80954830