Skip to content
uoyo edited this page Jun 1, 2020 · 3 revisions

通过下面的操作步骤,您将建立一个小小的MiCake演示程序。

环境条件

  • .NET Core SDK 3.0 +
  • 带有ASP.NET和Web开发的 Visual Studio 2019 或者Visual Studio Code
  • MariaDb(下载地址) [您可以根据您的个人偏好选择数据库,比如SqlServer、SqlLite等。这将决定您后面使用何种EFCore数据链接包]

搭建起步程序

1.新建项目

  • 从 Visual Studio “文件” 菜单中选择“新建” >“项目” 。
  • 选择“ASP.NET Core Web 应用程序” 。
  • 将该项目命名为 MiCakeDemo 。

2.配置

  • Visual Studio中选择“工具”>“NuGet 包管理器”>“包管理器控制台”
  • 执行以下包安装指令:
Install-Package Pomelo.EntityFrameworkCore.MySql
Install-Package Microsoft.EntityFrameworkCore.Tools
Install-Package MiCake.AspNetCore.Start
  • 新增一个叫做MyEntryModule.cs的文件,该类的作用是告诉MiCake该从哪个程序集启动:
public class MyEntryModule : MiCakeModule
{
}
  • 在项目文件夹中,使用以下代码创建 MyDbContext.cs
public class MyDbContext : MiCakeDbContext
{
    public MyDbContext(DbContextOptions options) : base(options)
    {
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // this line is very import.
        base.OnModelCreating(modelBuilder);
    }
}

到目前为止,您会发现这和您建立一个普通的EFCore应用没有一点区别。是的,以上操作对于经常使用EFCore的朋友将感到非常熟悉。

  • 在项目文件夹中,使用以下代码创建 Book.cs
public class Book : AggregateRoot<Guid>
{
    public string Name { get; private set; }
    public string Author { get; private set; }

    public Book()
    {
        Id = Guid.NewGuid();
    }

    public Book(string name, string author) : this()
    {
        CheckValue.NotNull(name, nameof(name));
        CheckValue.NotNull(author, nameof(author));

        Name = name;
        Author = author;
    }

    public void ChangeName(string name)
    {
        CheckValue.NotNullOrEmpty(name, nameof(name));
        Name = name;
    }
}
  • 在MyDbContext.cs添加如下代码:
public class MyDbContext : MiCakeDbContext
{
   //Add this line
   public DbSet<Book> Books { get; set; }

   …………
}
  • 在Startup.cs添加如下代码:
 // This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();

   //添加该代码 用于配置EFCore
    services.AddDbContext<BaseAppDbContext>(options =>
    {
        options.UseMySql("Server=localhost;Database=micakeexample;User=root;Password=a12345;", mySqlOptions => mySqlOptions
            .ServerVersion(new ServerVersion(new Version(10, 5, 0), ServerType.MariaDb)));
    });
   //添加该代码 用于配置MiCake
   services.AddMiCakeWithDefault<MyDbContext, MyEntryModule>()
           .Build();
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseHttpsRedirection();
    app.UseRouting();
    app.UseAuthorization();
    //添加该代码 用于启动MiCake
    app.StartMiCake();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}
  • 在Controller文件夹中创建一个Controller,名为BookController.cs:
[ApiController]
[Route("[controller]/[action]")]
public class BookController : ControllerBase
{
    private readonly IRepository<Book, Guid> _bookRepository;

    public BookController(IRepository<Book, Guid> bookRepository)
    {
        _bookRepository = bookRepository;
    }

    [HttpPost]
    public async Task AddBookAsync(string name, string author)
    {
        await _bookRepository.AddAsync(new Book(name, author));
    }

    [HttpPost]
    public async Task DeleteBookAsync(Guid bookId)
    {
        var currentBook = await _bookRepository.FindAsync(bookId);
        await _bookRepository.DeleteAsync(currentBook);
    }

    [HttpPost]
    public async Task ChangeBookNameAsync(Guid bookId,string bookName)
    {
        var currentBook = await _bookRepository.FindAsync(bookId);
        currentBook.ChangeName(bookName);

        await _bookRepository.UpdateAsync(currentBook);
    }
}

到目前为止您已经完成了该演示项目:关于Book的简单增删改查。接下来,运行起来吧!

运行起来

  • 进行数据库迁移(假如您选择使用了MariaDb,您可以先使用安装包中自带的数据库管理工具HeidiSQL来建立默认数据库,名为micakeexample)。在Visual Studio中选择“工具”>“NuGet 包管理器”>“包管理器控制台”,运行:
dotnet ef migrations add AddBookEntity
  • 完成后继续执行如下命令:
dotnet ef database update

迁移完成后,您就可以通过F5运行该AspNet Core项目。

Swagger 支持

为了更直观的看到上面已经建立的API服务,可以引入Swagger来查看。

  • Visual Studio中选择“工具”>“NuGet 包管理器”>“包管理器控制台”,运行:
Install-Package NSwag.AspNetCore
  • 调整Startup.cs文件
public void ConfigureServices(IServiceCollection services)
{
    ………………

    //Add Swagger
    services.AddSwaggerDocument(document => document.DocumentName = "MiCake Demo Application");
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    …………

    //Add Swagger
    app.UseOpenApi();
    app.UseSwaggerUi3();
}

示例DEMO

MiCake.Samples 是MiCake的示例项目仓库,在这里面可能会有对您有帮助的示例代码片段。您可以跳转至该仓库进行查阅。

最后

通过本次小案例,您已经学会了MiCake的基础使用。对于曾经使用过EFCore的同学,将感到非常的简单,几乎没有任何的学习成本。

该案例中,我们建立一个叫做“Book”的聚合根,然后将“修改书名”这个行为赋予了该聚合根(ChangeName方法)。这是一个很小很小的Demo,但是在不知不觉中您已经接触到一些了“领域驱动设计(DDD)”的知识:专注于领域对象的构建,并将行为职责划分给对应的对象。随着项目业务的不断复杂和代码量的增多,您将逐渐感受到该特性带来的益处。

可能您已经注意到,上面的案例除了一些基础环境的配置以外,开发重心一直都在“核心”的地方:“Book”,它是我们业务的主要体现,随后我们通过“Book”的仓储(Repository)来完成对外的操作。随着业务的明确和增长需要添加新功能时,只需要按照同样的步骤添加“领域对象”即可,我们始终将重心放在“领域层”中,其它的大部分交互都将由MiCake来完成。

在后期的使用中,建议您先了解有关“领域驱动设计(DDD)”方面的概念知识(该方面知识您可以参考《如何运用领域驱动设计系列文章》 或者阅读Eric Evans所编著的《领域驱动设计》)。

Clone this wiki locally