MVC5+EF框架——VS2019 我的第一个项目:SportsStore

1.项目开始

(1)创建VS2019的解决方案和项目:
首先创建空白解决方案
在这里插入图片描述
然后依次创建web,单元测试和类库项目(都是.NET Framework)
在这里插入图片描述
最后得到的是这幅情景(由于SportsStore.Domain中Class1.cs没什么用,故删去)
在这里插入图片描述
为了使调试更加便捷,右击SportsStore.WebUI那里,将其设置为启动项目
在这里插入图片描述
还可以通过右击SportsStore.WebUI那里选择属性,然后单击web按钮,勾选“特定页”,这样就可以让浏览器直接访问其根目录(不用去猜测URL了)
在这里插入图片描述
(2)安装工具包
首先安装的是Ninject和Moq,按照图中所示打开NuGet命令行
在这里插入图片描述
命令行

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

Install-Package Moq -version 4.1.1309.1617

Install-Package Microsoft.Aspnet.Mvc -version 5.0.0

分别输入上面的命令,如下图:
在这里插入图片描述
(3)添加项目之间的引用
所需的项目依赖项:
在这里插入图片描述
例如SportsStore.Domain:
过程是:右键点击项目名SportsStore.Domain,然后“添加”、“引用”、选择“扩展”
在这里插入图片描述
点确定
在这里插入图片描述
例如SportsStore.WebUI 解决方案依赖项:
在这里插入图片描述
类似的就不展示了(上面已经很详细啦)

(4)设置DI容器
首先在.WebUI中建立Infrastructure(文件夹)文件夹,在其中添加一个名称为NinjectDependencyResolver.cs(Ninject依赖解析器)的类文件。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using Moq;
using Ninject;

namespace SportsStore.WebUI.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()
        {
            //将绑定放在这里
        }
    }
}

然后需要搭建上述代码与MVC之间的桥梁,在APP_Start/NinjectWebCommon.cs中完成的:

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

2.域模型

如,在Domain中创建一个Product.cs的类文件:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SportsStore.Domain.Entities
{
    public class Product
    {
        public int ProductID { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public decimal Price { get; set;}
        public string Category { get; set; }
    }
}

(1)创建抽象存储库

using SportsStore.Domain.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SportsStore.Domain.Abstract
{
    public interface IProductRepository
    {
        IEnumerable<Product> Products { get; }
    }
}

(2)创建模仿存储库
(在建立数据库之前我们先模拟出一个有数据的存储库)
(可以忽略)

3.显示产品列表

(1)添加控制器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SportsStore.Domain.Abstract;
using SportsStore.Domain.Entities;

namespace SportsStore.WebUI.Controllers
{
    public class ProductController : Controller
    {
        private IProductRepository repository;
        // GET: ProductController
        public ProductController(IProductRepository productRepository)
        {
            this.repository = productRepository;
        }
    }
}

声明了对IProductRepository 接口的依赖项,这导致该控制器实例化时,Ninject会为产品存储库注入其依赖项。下一步添加了一个动作方法,名称为“List”,它将渲染一个视图,以显示产品的完整列表。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SportsStore.Domain.Abstract;
using SportsStore.Domain.Entities;

namespace SportsStore.WebUI.Controllers
{
    public class ProductController : Controller
    {
        private IProductRepository repository;
        // GET: ProductController
        public ProductController(IProductRepository productRepository)
        {
            this.repository = productRepository;
        }
        public ViewResult List()
        {
            return View(repository.Products);
        }
    }
}

这样调用的View方法没有指定具体的视图名称,是告诉框架为该动作方法渲染一个默认类型视图,给View方法传递Products对象列表,是给框架提供数据,以便这些数据填充强类型视图中的Model对象
(2)添加布局、视图起始文件及视图
右键点击List方法,添加视图“List”
在这里插入图片描述
模型类选择Product,同时确保勾选使用布局页这个复选框,然后点击“添加”便可以创建该视图
在这里插入图片描述
然后编辑_Layout.cshtml文件(有些自动生成的东西直接删就行)
在这里插入图片描述
然后我们要渲染视图数据
需要编辑@model表达式,并且添加一些html和Razor表达式,以显示产品的细节
改成这样:

@using SportsStore.Domain.Entities
@model IEnumerable<Product>

@{ 
    ViewBag.Title = "Products";
}

@foreach(var p in Model)
{
    <div>
        <h3>@p.Name</h3>
        @p.Description
        <h4>@p.Price.ToString("c")</h4>
    </div>
}

(3)设置默认的路由
将原来的Home改成“Product”,并且将原来的Index改成“List”。这种修改是把对默认的URL的请求定向到Product控制器的List动作方法。
在这里插入图片描述
(4)运行程序
首先出现了这种错误
在这里插入图片描述
出现了bug,我不会了

4.准备数据库

以SQL Server作为数据库,用实体框架EF来访问数据库(EF是对象关系映射的框架,即ORM)
ORM框架让开发人员可以用规则的C#对象表示关系数据库的表、列和行。
在这里插入图片描述

Install-Package EntityFramework -projectname SportsStore.Domain
Install-Package EntityFramework -projectname SportsStore.WebUI
原创文章 13 获赞 9 访问量 4269

猜你喜欢

转载自blog.csdn.net/weixin_43577675/article/details/104025695