首先 新建一个 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 版本的问题, 要校对清楚

 

.net core 做网站用什么框架 .net core框架搭建_Startup