Azure和.NET Core成就天作之合

\u0026#xD;

本文要点

\u0026#xD;\u0026#xD;
  • ASP.NET Core支持跨平台(window/macOS/Linux),跟Azure托管的Windows和Linux虚拟机非常匹配。\u0026#xD;\t
  • ASP.NET Core包括一个内置的容器,它支持构造函数注入。\u0026#xD;\t
  • 在ASP.NET Core应用程序的启动类的ConfigureServices中配置该容器的服务\u0026#xD;\t
  • Azure资源管理器模板允许脚本化配置Azure虚拟机及其所需的软件\u0026#xD;\t
  • Azure应用程序服务将服务器维护的底层细节抽象出来,并让开发人员直接部署ASP.NET项目到Azure。\u0026#xD;
\u0026#xD;\u0026#xD;

随着.NET Core 2.0的发布,微软拥有了通用、模块化、跨平台和开源的平台的下一个主要版本,该平台最初发布于2016年。.NET Core已经被创建为拥有很多在目前发布的.NET框架中可用的API。最初创建它的目的是为下一代ASP.NET解决方案提供支持,但是现在成为许多其他场景的基础,包括IoT、云以及下一代移动解决方案。在本系列文章中,我们将探讨.NET Core的优点以及它如何不仅仅有益于传统的.NET开发人员,还有益于所有需要把稳健、高性能和经济的解决方案带入市场的技术人员。

\u0026#xD;\u0026#xD;

本文是《.NET Core》系列文章的其中之一。您可以通过RSS订阅以接收相关通知。

\u0026#xD;\u0026#xD;

我最感兴趣的.NET Core的特性之一是跨平台支持,无论是在开发期还是在运行期。对于.NET,您不再被限制于Windows。如今,您可以使用Linux和macOS进行开发和运行应用程序。还有,不再要求开发和运行平台相同,因此,您可以在Mac上开发您的.NET Core应用程序,然后部署到Windows和Linux服务器。

\u0026#xD;\u0026#xD;

微软的云平台Azure

\u0026#xD;\u0026#xD;

Azure是微软的云平台,能出色地匹配.NET Core应用程序,因为其拥有大量用于托管这些应用程序的基础设施和平台服务,以及广泛的跨平台支持。Azure有一套基础架构服务,提供计算、存储和网络功能,使客户能够像管理传统数据中心的基础架构一样部署虚拟服务器。 这种方法为客户提供对托管应用程序的基础架构和操作系统配置的强大控制。 Azure虚拟机支持多种版本的Windows Server和多种Linux版本,包括Red Hat、CentOS、Suse等。

\u0026#xD;\u0026#xD;

在把您的.NET Core应用程序部署到Azure之前,您需要在Azure中设置应用程序主机或运行。在Azure中,您可以有很多方法来部署基础架构和服务。最简单容易的入门方法是使用Azure门户网站。从该门户网站,您可以在市场上找到所需的服务,并通过一系列询问向导来配置和部署这些服务。如果您正在配置虚拟机,只要虚拟机处于运行状态了,就可以进行远程管理和配置了,如果运行在Windows中,就使用远程桌面(Remote Desktop);而如果运行在Linux中,则使用SSH。

\u0026#xD;\u0026#xD;

如果您跟我一样,是个DevOps的粉丝,也许喜欢自己尽可能地编写脚本,这样就可以做到可重复和精简的。Azure资源管理(Azure Resource Manager,简称ARM)模板允许您在Azure中自动部署服务。ARM模板只是简单的JSON文件,定义了您希望部署的资源以及它们之间的关系。这些ARM模板很受欢迎,并且有个GitHub repo,它含有数百个为许多服务、平台和配置准备的预置模板。您可以找到这些模板和这个GitHub repo。

\u0026#xD;\u0026#xD;

除了部署和配置Azure服务,您还可以使用ARM模板来配置操作系统,以及使用虚拟机扩展来安装其他依赖项。例如,如果您在Ubuntu Linux上设置一个web服务器,您就需要部署Ubuntu Linux虚拟机,然后部署一个像Apache的web服务器。利用自定义脚本虚拟机扩展,您能够在虚拟机完成部署后执行自定义脚本。利用这些自定义脚本,您可以做很多事,像安装其他服务以及类似Apache及PHP的应用程序服务器。您可以在Azure Quickstart模板GitHub repo中看到一个例子,它是用Apache部署Ubuntu Linux服务器ARM模板。在GitHub上呈现的README.md文件中,您可以点击“Deploy to Azure”按钮,如图1所示,以开始把选定模板部署到您的Azure订阅的过程。一旦您拥有web服务器,就可以在Azure中部署和运行ASP.NET Core应用程序了。

\u0026#xD;\u0026#xD;



\u0026#xD;\u0026#xD;

图1 – 拥有Apache GitHub README.md的Ubuntu

\u0026#xD;\u0026#xD;

创建一个ASP.NET Core应用程序

\u0026#xD;\u0026#xD;

现在是时候创建一个我们可以部署到Azure的.NET Core应用程序了。利用Visual Studio 2017,我使用ASP.NET Core创建了一个简单的web API。由于那个新的Hello World!网络应用程序看起来是个待办事项列表,我就创建了一个待办事项列表API。

\u0026#xD;\u0026#xD;

首先,我在Visual Studio中创建了一个新项目,选择了web类别和ASP.NET Core Web Application模板,如图2所示。

\u0026#xD;\u0026#xD;



\u0026#xD;\u0026#xD;

图2 – Visual Studio 2017 新ASP.NET Core Web Application

\u0026#xD;\u0026#xD;

创建项目之后,我添加了一个定义属性为待办事项列表的模型类,代码如图3所示。我让它很简单,只创建了id的属性和待办事项列表项的名称,以及一个用于跟踪该项是否完成的布尔量。

\u0026#xD;\u0026#xD;
\u0026#xD;public class TodoItem\u0026#xD;{\u0026#xD;\u0026#xD;    public string Id { get; set; }\u0026#xD;    public string Name { get; set; }\u0026#xD;    public bool IsComplete { get; set; }\u0026#xD;}
\u0026#xD;\u0026#xD;

图3 – TodoItem.cs模型类

\u0026#xD;\u0026#xD;

在创建数据访问类时,我喜欢使用仓储模式,因此,我为待办事项列表存储库创建了一个接口,如图4所示。这定义了所有我需要用于访问数据的方法,包括一个读取单个待办事项的get方法、一个返回所有待办事项列表项的get方法,还有用于添加、更新和删除待办事项列表项的方法。

\u0026#xD;\u0026#xD;
\u0026#xD;
\u0026#xD;public interface ITodoItemRepository\u0026#xD;{\u0026#xD;    TodoItem Get(string id);\u0026#xD;    IList\u0026lt;TodoItem\u0026gt; Get();\u0026#xD;    void Add(TodoItem item);\u0026#xD;    void Update(TodoItem item);\u0026#xD;    void Delete(string id);\u0026#xD;}\u0026#xD;
\u0026#xD;\u0026#xD;

图4 – ITodoItemRepository.cs 待办事项列表仓储模式接口

\u0026#xD;\u0026#xD;

然后,我用实体框架(Entity Framework,简称EF)创建了待办事项列表项目仓储接口的实现,如图5所示。这包括EF上下文类和使用该EF上下文的仓储类。

\u0026#xD;
\u0026#xD;\u0026#xD;
\u0026#xD;
\u0026#xD;public class TodoContext : DbContext\u0026#xD;{\u0026#xD;    public TodoContext(DbContextOptions\u0026lt;TodoContext\u0026gt; options)\u0026#xD;        : base(options)\u0026#xD;    {\u0026#xD;    }\u0026#xD;\u0026#xD;    public DbSet\u0026lt;TodoItem\u0026gt; TodoItems { get; set; }\u0026#xD;\u0026#xD;}\u0026#xD;public class TodoItemRepository : ITodoItemRepository\u0026#xD;{\u0026#xD;    private readonly TodoContext _context;\u0026#xD;\u0026#xD;    public TodoItemRepository(TodoContext context)\u0026#xD;    {\u0026#xD;        _context = context;\u0026#xD;\u0026#xD;        if (!_context.TodoItems.Any())\u0026#xD;        {\u0026#xD;            _context.TodoItems.Add(new TodoItem { Name = \"Item1\" });\u0026#xD;            _context.SaveChanges();\u0026#xD;        }\u0026#xD;    }\u0026#xD;\u0026#xD;    public TodoItem Get(string id)\u0026#xD;    {\u0026#xD;        return _context.TodoItems.FirstOrDefault(t =\u0026gt; t.Id == id);\u0026#xD;    }\u0026#xD;\u0026#xD;    public IList\u0026lt;TodoItem\u0026gt; Get()\u0026#xD;    {\u0026#xD;        return _context.TodoItems.ToList();\u0026#xD;    }\u0026#xD;\u0026#xD;    public void Add(TodoItem item)\u0026#xD;    {\u0026#xD;        _context.TodoItems.Add(item);\u0026#xD;        _context.SaveChanges();\u0026#xD;
\u0026#xD;\u0026#xD;

图5 – TodoContext.cs和TodoListRepository.cs

\u0026#xD;\u0026#xD;

最后,我用图6中所示的代码为待办事项列表web API创建了控制器。该控制器只是使用ITodoItemRepository并执行恰当的数据访问方法。

\u0026#xD;
\u0026#xD;\u0026#xD;
\u0026#xD;
\u0026#xD;[Produces(\"application/json\")]\u0026#xD;[Route(\"api/Todo\")]\u0026#xD;public class TodoController : Controller\u0026#xD;{\u0026#xD;    private ITodoItemRepository _repository;\u0026#xD;\u0026#xD;    public TodoController(ITodoItemRepository repository)\u0026#xD;    {\u0026#xD;        _repository = repository;\u0026#xD;    }\u0026#xD;        \u0026#xD;    [HttpGet]\u0026#xD;    public IEnumerable\u0026lt;TodoItem\u0026gt; Get()\u0026#xD;    {\u0026#xD;        return _repository.Get();\u0026#xD;    }\u0026#xD;        \u0026#xD;    [HttpGet(\"{id}\

你可能感兴趣的:(Azure和.NET Core成就天作之合)