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