首先 新建一个 Core 2.0 的 Web 空项目
一言不合添加2个类库
添加 Domain 类库, 用于存放领域模型, 可以吧数据上下文也放这里
添加 Services 类库, 业务层, 后面可以用 Ioc
Web 项目引用 Domain, 引用 Services
Services 项目引用 Domain
Web
Web 项目下添加 appsettings.json 用于 ASP.NET 的配置, 包括数据库链接字符串什么的
Web 项目下添加 Controllers 文件夹 用作后面的 Mvc
Web 项目下的 Controllers 添加一个 Controller
如果是初始添加的话, 需要配置下环境
在 VS IDE 中可以选择最小依赖项
第一步 在 Startup 下添加
public IConfiguration Configuration { get; }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
第二步 在 Startup.ConfigureServices 方法下注册 Mvc
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc();
}
第三步 在 Startup.Configure 下添加 Mvc 路由注册
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// 暂时不知道干嘛的
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
// 暂时不知道干嘛的
app.UseStaticFiles();
// 注册 Mvc 路由
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
在 Controllers 下添加 HomeController
右击 Index 下的 Views 添加视图 (也可以手工添加 View 文件夹 然后添加 Index 视图)
运行下看看, 第一步算是完成了
在 Views 下手工添加 _ViewStart.cshtml
(名字似乎一定要这个, 是个约定, 用来模拟以前的 MVC 视图引擎)
@{
Layout = "~/Views/_Shared/_Layout.cshtml";
}
在 Views 下手工添加 _Shared 文件夹
(这里我吧 原来 Mvc 的 Shared 改成了 _Shared , 不影响)
再添加 _Layout 视图
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="~/Scripts/jquery-3.2.1.min.js"></script>
</head>
<body>
@RenderBody()
</body>
</html>
如果要添加区域的话
就在 Web 项目里添加区域
需要的话, 建立 Web Api
注意, Web Api 的基类 已经没有 ApiController 了
都统一用 Controller
也没有 System.WebHttp 了
没有 IHttpActionResult 了, 都统一为 IActionResult
要为区域设置路由的话 有几种办法
1. 在 Startup 中注册一个带 Area 的路由
// 注册区域路由
app.UseMvc(routes =>
{
routes.MapRoute(
name: "areas",
template: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
);
});
然后在 Area 里创建 Controller
注意的是, 需要在 Controllers 中添加 Area
[Area("Admin")]
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
}
否则可能会定向不到 (不晓得为什么)
2. 每个 Controller 都设置 Route
基于 Mvc 的 Controller 如果这么设置了
好像就找不到视图了, 都会引用根目录下的视图, 不知道为什么
[Produces("application/json")]
[Route("/Agent4App/[Controller]/[Action]")]
public class BaseApiController : Controller
{
}
似乎第一种办法对所有的 区域都有效
目前还不知道自由的定义路由怎么做
Domain
Domain 项目引用 Nuget 包
// 用作 EF 实体映射
Microsoft.EntityFrameworkCore
// 用作数据迁移
Microsoft.EntityFrameworkCore.Tools
Microsoft.EntityFrameworkCore.SqlServer
添加实体
public class Entity
{
[Key]
public int Id { get; set; }
public bool IsDeleted { get; set; }
}
public class Sys_User : Entity
{
public string Mobile { get; set; }
public string Password { get; set; }
}
添加上下文
(跟原来的 .net 不一样, 要注入 option, 这个在 Startup 里注册)
public class UjiaCoreDbContext : DbContext
{
/// <summary>
/// 将属性配置注入到这里
/// </summary>
/// <param name="options"></param>
public UjiaCoreDbContext(DbContextOptions<UjiaCoreDbContext> options) : base(options)
{
}
/// <summary>
/// 如果不用注入的话, 也可以使用这种方式
/// </summary>
/// <param name="optionsBuilder"></param>
//protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
//{
// //注入Sql链接字符串
// optionsBuilder.UseSqlServer(@"Server=XXX;Database=XXX;Trusted_Connection=True;");
//}
public DbSet<Sys_User> Users { get; set; }
}
修改 Web 项目下的 appsettings.json
{
"ConnectionStrings": {
"UJiaCoreConnection": "Server=.;Database=UjiaCoreDb;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
在 Web 项目下的 Startup.ConfigureServices 下注册上下文跟数据库的关系
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<UJiaCoreDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("UJiaCoreConnection")));
services.AddMvc();
}
至此, 上下文跟数据库算建立好了联系, 但是还是需要生成数据库先
针对存放上下文的类库 Domain 项目 添加数据迁移
Add-Migration 01 -Context UJiaCoreDbContext
// 手动更新数据库
Update-Database -Context UJiaCoreDbContext
查看下数据库, 应该已经把表格建立起来了
接下来 在 HomeController 下可以通过注入 上下文来对数据库进行操作
public class HomeController : Controller
{
UJiaCoreDbContext Context;
public HomeController(UJiaCoreDbContext context)
{
Context = context;
}
public IActionResult Index()
{
var user = Context.Users.FirstOrDefault();
if (user == null)
{
user = new Sys_User
{
CreateDate = DateTime.Now,
IdentityCard = "330302199001010001",
IsDeleted = false,
Mobile = "13000000001",
Name = "User1",
Password = "123456"
};
Context.Users.Add(user);
Context.SaveChanges();
}
return View(user);
}
}
Services
引用工作单元
Microsoft.EntityFrameworkCore.UnitOfWork
建立一个接口和一个实现类
并注入 UnitOfWork
public class UserService : IUserService
{
private readonly IUnitOfWork _unitOfWork;
public UserService(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
public Sys_User GetEntity(int Id)
{
// 获取数据集
var repository = _unitOfWork.GetRepository<Sys_User>();
// 调用数据集方法
return repository.Find(Id);
}
}
在 Startup 中注册 Ioc 和数据仓储(其实我不是很懂是什么意思, 也不知道干嘛用)
(如果同一个接口注册多个实例的话, 似乎是最下面那个有作用)
//注册数据仓储, 似乎不要这句话, 也能在 Services 里用 Context 构造函数注入.. 不知道这句话有什么用
services.AddUnitOfWork<UJiaCoreDbContext>();
//注册service,为了避免都要在此声明,所以之后会统一注册DotNetCore20.Service下的所有service
services.AddScoped(typeof(IUserService), typeof(UserService));
也不知道怎么一次性全部注册
然后在 Web 项目上的 Controllers 注册 Services
public class UserController : BaseApiController
{
private IUserService Service { get; set; }
public UserController(IUserService service)
{
Service = service;
}
public Sys_User GetUser(int Id)
{
var user = Service.GetEntity(Id);
if (user == null)
{
user = new Sys_User
{
CreateDate = DateTime.Now,
IdentityCard = "330302199001010001",
IsDeleted = false,
Mobile = "13000000001",
Name = "User1",
Password = "123456"
};
Service.Insert(user);
}
return user;
}
public IList<Sys_User> GetUsers()
{
var user = Service.GetEntities();
return user;
}
}
可能是第一次用 不太好用
方法很少
感觉不是很有必要, 还不如直接在 Services 层用 Context (这个是可以的)
没必要一定要用 工作单元
Core 一些新的东西
// 微软的一个扩展的 记录日志的类
// Microsoft.Extensions.Logging.ILog
// 微软的一个自带身份验证的东西
Microsoft.AspNetCore.Identity.IdentityUser
Microsoft.AspNetCore.Identity.SignInManager
Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<T>
视图还可以是继承 PageModel 的
类似于 ASP.NET WebFrom 神奇
部署
参考地址:
https://docs.microsoft.com/zh-cn/dotnet/core/windows-prerequisites?tabs=netcore21
Core 在部署上也是有几个坑的
首先在 Windows 201 环境中 在 IIS 中部署的话
首先要安装 Windows8.1-KB2999226_x64 这个补丁
https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=49081
否则就会出现 502
其次, 要安装 core 的运行环境 runtiming
其中 web hostring 就已经包含了 runtiming
https://www.microsoft.com/net/download/windows
如果在 IIS 上还出现问题, 可以先直接在目录下进行 dotnet XXXX.dll 试试
如果没问题 则可能是 IIS 的问题
不过有可能是 dotcore 版本的问题, 要校对清楚