Furion Blog http://furion.baiqian.ltd/blog Furion Blog Tue, 31 May 2022 00:00:00 GMT https://validator.w3.org/feed/docs/rss2.html https://github.com/jpmonette/feed en <![CDATA[7. GlobalUsings 的使用]]> http://furion.baiqian.ltd/blog/global-usings http://furion.baiqian.ltd/blog/global-usings Tue, 31 May 2022 00:00:00 GMT 简介

.NET6/C#10 之后,微软新增了 GlobalUsings 机制,可以在项目的根目录下创建一个 GlobalUsings.cs 文件,把常用的 using 放置其中。

这样 GlobalUsings.cs 所在的项目 .cs 文件就无需重复 using 了,大大的提高开发效率,也让代码变的更加简洁。

必要配置

启用 GlobalUsings 机制需要以下两个步骤:

  1. 在你需要全局 using 的项目层根目录创建 GlobalUsings.cs 文件,如果多个项目层需要,则每个层都应该有一个 GlobalUsings.cs
  2. 编辑项目的 .csproj 文件,添加 <ImplicitUsings>enable</ImplicitUsings>,注意是在 <PropertyGroup> 中添加,通常和 <TargetFramework> 同父同级

基本使用

配置之后,现在就可以把常用的 using 放到 GlobalUsings.cs 中了,写法如下:

Furion 推荐的全局命名空间
global using Furion;
global using Furion.DatabaseAccessor;
global using Furion.DataEncryption;
global using Furion.DataValidation;
global using Furion.DependencyInjection;
global using Furion.DynamicApiController;
global using Furion.Extensions;
global using Furion.FriendlyException;
global using Mapster;
global using Microsoft.AspNetCore.Authorization;
global using Microsoft.AspNetCore.Http;
global using Microsoft.AspNetCore.Mvc;
global using Microsoft.CodeAnalysis;
global using Microsoft.EntityFrameworkCore;
global using System.ComponentModel.DataAnnotations;

注意必须以 global 开头!

小知识

一般推荐把实体类的命名空间也放进去,因为仓储 IRepository<T> 使用的频率非常高。

另外推荐大家在 Visual Studio 中安装 CodeMaid 插件哦,自动清理解决方案所有无用的 using,结合 GlobalUsings.cs 非常棒!

个别情况

可能由于 Visual Studio 版本的问题,导致 GlobalUsings.cs 定义出错,这时候需要在 using 后面加 global::,如:

global using global::Furion;

接下来在代码中使用:

// 无需 using Furion 的命名空间了哦,清爽了不少

namespace Your.Application;

public class DefaultAppService : IDynamicApiController
{
private readonly IRepository<BoardCard> _boardCardRepository;
private readonly IRepository<BoardGroup> _boardGroupRepository;
private readonly IRepository<BoardCardAttachment> _boardCardAttachmentRepository;
private readonly IRepository<BoardCardUser> _boardCardUserRepository;
}

// ....

默认全局 using

实际上微软已经自动把一些常用的 using 在编译后的代码中自动补上了,路径在 项目/obj/Debug/net6.0/项目.GlobalUsings.cs 文件中,文件内容如下:

// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

也就是以上的 using 无需写在你创建的 GlobalUsings.cs 中了,微软会在编译时自动合并。

]]>
furion furos .net .netcore .net5 .net6
<![CDATA[6. .NET 6 Preview 7 尝鲜]]> http://furion.baiqian.ltd/blog/net6-preview7 http://furion.baiqian.ltd/blog/net6-preview7 Wed, 11 Aug 2021 00:00:00 GMT 2021 年 08 月 11 日,微软发布了 .NET 6 Preview 7 版本,Furion 在当天第一时间适配了该版本,并发布 Furion v3.0.0-rc.2 版本。

Furion .NET 6 Preview 7 源码地址

安装 .NET 6 Preview 6 SDK

尝鲜之前,首先先安装 .NET 6 Preview 7 SDK,下载地址:https://dotnet.microsoft.com/download/dotnet/6.0

下载对应系统和处理器版本即可。

旧项目升级

编辑所有 .csproj 项目,修改 <TargetFramework>net5.0</TargetFramework><TargetFramework>net6.0</TargetFramework>

同时升级所有 MicrosoftFurion 包为最新版本,Furion 最新版本为:v3.0.0-rc.1

新项目使用

升级 Visual Studio 2019

目前 .NET 6 Preview 7 支持使用 Visual Studio 2019 Preview 16.11.0 Preview 4.0 版本,注意是 Preview 最新版本。下载地址:https://visualstudio.microsoft.com/zh-hans/thank-you-downloading-visual-studio/?sku=enterprise&ch=pre&rel=16

已经安装了 Visual Studio 2019 Preview 版本的朋友直接升级到最新版即可。

特别说明

如果使用 Visual Studio Code 开发,可忽略此选项。

第一个例子

Furion v3.0.0-rc.2 目前提供了所有类型的脚手架,版本号统一 3.0.0-rc.2

安装脚手架,打开 CMD/Powershell 执行以下命令:

dotnet new --install Furion.Template.Api::3.0.0-rc.2

创建项目

dotnet new furionapi -n FurionNET6

打开并启动项目

打开浏览器查看效果即可。

]]>
furion furos .net .netcore .net5 .net6
<![CDATA[5. 在控制台中使用]]> http://furion.baiqian.ltd/blog/console http://furion.baiqian.ltd/blog/console Sat, 24 Jul 2021 00:00:00 GMT
内容过时

当前内容已过时,请查看 2.1 入门指南 - 2.1.10.3 Console 初始化

Furionv2.15.3+ 版本开始,支持全平台应用程序开发,包括 Web控制台WinFormWPFXamarin/MAUI 等。

在控制台中使用示例:

using Furion;
using Furion.DependencyInjection;
using Furion.RemoteRequest.Extensions;
using Microsoft.Extensions.DependencyInjection;
using System;

namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
// 创建一个服务容器
var services = Inject.Create();
// 注册服务
services.AddRemoteRequest();
// 所有服务注册完毕后调用 Build() 构建
services.Build();

// 使用
var helloService = App.GetService<IHelloService>();
Console.WriteLine(helloService.SayHello());

Console.WriteLine("=============");

var baidu = "https://www.baidu.com".GetAsStringAsync().GetAwaiter().GetResult();
Console.WriteLine(baidu);
}
}

public interface IHelloService
{
string SayHello();
}
public class HelloService : IHelloService, ITransient
{
public string SayHello()
{
return "Hello Furion.";
}
}
}

以上代码通过 var services = Inject.Create(); 创建一个服务集合,最后通过 services.Build() 即可完成初始化。

]]>
furion furos .net .netcore .net5 .net6
<![CDATA[4. .NET 6 Preview 6 尝鲜]]> http://furion.baiqian.ltd/blog/net6-preview6 http://furion.baiqian.ltd/blog/net6-preview6 Thu, 15 Jul 2021 00:00:00 GMT 2021 年 07 月 15 日,微软发布了 .NET 6 Preview 6 版本,Furion 在当天第一时间适配了该版本,并发布 Furion v3.0.0-rc.1 版本。

Furion .NET 6 Preview 6 源码地址

安装 .NET 6 Preview 6 SDK

尝鲜之前,首先先安装 .NET 6 Preview 6 SDK,下载地址:https://dotnet.microsoft.com/download/dotnet/6.0

下载对应系统和处理器版本即可。

旧项目升级

编辑所有 .csproj 项目,修改 <TargetFramework>net5.0</TargetFramework><TargetFramework>net6.0</TargetFramework>

同时升级所有 MicrosoftFurion 包为最新版本,Furion 最新版本为:v3.0.0-rc.1

新项目使用

升级 Visual Studio 2019

目前 .NET 6 Preview 6 支持使用 Visual Studio 2019 Preview 16.11.0 Preview 3.0 版本,注意是 Preview 最新版本。下载地址:https://visualstudio.microsoft.com/zh-hans/thank-you-downloading-visual-studio/?sku=enterprise&ch=pre&rel=16

已经安装了 Visual Studio 2019 Preview 版本的朋友直接升级到最新版即可。

特别说明

如果使用 Visual Studio Code 开发,可忽略此选项。

第一个例子

Furion v3.0.0-rc.1 目前提供了所有类型的脚手架,版本号统一 3.0.0-rc.1

安装脚手架,打开 CMD/Powershell 执行以下命令:

dotnet new --install Furion.Template.Api::3.0.0-rc.1

创建项目

dotnet new furionapi -n FurionNET6

打开并启动项目

打开浏览器查看效果即可。

]]>
furion furos .net .netcore .net5 .net6
<![CDATA[3. .NET 6 Preview 5 尝鲜]]> http://furion.baiqian.ltd/blog/net6-preview5 http://furion.baiqian.ltd/blog/net6-preview5 Fri, 18 Jun 2021 00:00:00 GMT 2021 年 06 月 18 日,微软发布了 .NET 6 Preview 5 版本,Furion 在当天第一时间适配了该版本,并发布 Furion v3.0.0-preview.5.21301.9 版本。

Furion .NET 6 Preview 5 源码地址

等不及尝鲜了

安装 .NET 6 Preview 5 SDK

尝鲜之前,首先先安装 .NET 6 Preview 5 SDK,下载地址:https://dotnet.microsoft.com/download/dotnet/6.0

下载对应系统和处理器版本即可。

升级 Visual Studio 2019

目前 .NET 6 Preview 5 支持使用 Visual Studio 2019 Preview 16.11.0 Preview 2.0 版本,注意是 Preview 最新版本。下载地址:https://visualstudio.microsoft.com/zh-hans/thank-you-downloading-visual-studio/?sku=enterprise&ch=pre&rel=16

已经安装了 Visual Studio 2019 Preview 版本的朋友直接升级到最新版即可。

特别说明

如果使用 Visual Studio Code 开发,可忽略此选项。

第一个例子

Furion v3.0.0-preview.5.21301.9 目前提供了所有类型的脚手架,版本号统一 3.0.0-preview.5.21301.9

安装脚手架,打开 CMD/Powershell 执行以下命令:

dotnet new --install Furion.Template.Api::3.0.0-preview.5.21301.9

创建项目

dotnet new furionapi -n FurionNET6

打开并启动项目

打开浏览器查看效果即可。

]]>
furion furos .net .netcore .net5 .net6
<![CDATA[2. 文件上传下载]]> http://furion.baiqian.ltd/blog/fileupload-download http://furion.baiqian.ltd/blog/fileupload-download Tue, 02 Feb 2021 00:00:00 GMT 文件下载
[HttpGet, NonUnify]
public IActionResult FileDownload(string path, string fileName)
{
string filePath = "这里获取完整的文件下载路径";
return new FileStreamResult(new FileStream(filePath, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
}
关于前端获取文件名

如果前端获取不到文件夹,可添加以下配置:

_httpContextAccessor.HttpContext.Response.Headers.Add("Content-Disposition", $"attachment; filename={文件名}");
_httpContextAccessor.HttpContext.Response.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition");

文件上传

[HttpPost, NonUnify]
public async Task<IActionResult> UploadFileAsync(List<IFormFile> files)
{
// 保存到网站根目录下的 uploads 目录
var savePath = Path.Combine(App.HostEnvironment.ContentRootPath, "uploads");
if(!Directory.Exists(savePath)) Directory.CreateDirectory(savePath);

long size = files.Sum(f => f.Length);

foreach (var formFile in files)
{
if (formFile.Length > 0)
{
// 避免文件名重复,采用 GUID 生成
var filePath = Path.Combine(savePath, Guid.NewGuid().ToString("N") + Path.GetExtension(formFile.FileName)); // 可以替代为你需要存储的真实路径

using (var stream = System.IO.File.Create(filePath))
{
await formFile.CopyToAsync(stream);
}
}
}

// 在动态 API 直接返回对象即可,无需 OK 和 IActionResult
return Ok(new { count = files.Count, size });
}
关于使用axios上传文件,方法获取到参数files.Count=0

axios请求配置

    let formData = new FormData();
formData.append("files", this.file); //files需与方法里的参数files名称一样
let config = {
headers: {
"Content-Type": "multipart/form-data",
},
};
axios.post(this.uploadURL, formData, config).then((res) => {//需引入axios
console.log(res);
});
]]>
furion furos .net .netcore .net5 upload download
<![CDATA[1. HttpContext 应用]]> http://furion.baiqian.ltd/blog/httpcontext http://furion.baiqian.ltd/blog/httpcontext Mon, 01 Feb 2021 00:00:00 GMT HttpContext 重大调整

ASP.NET 的时代,我们通常通过 HttpContext 全局静态类获取请求上下文,但在 ASP.NET Core 中,HttpContext 是一个非静态的抽象类,无法手动创建,也无法通过静态获取。

虽然在 ASP.NET Core 中无法直接获取 HttpContext 对象。但是微软也提供了注入 IHttpContextAccessor 方式获取。

HttpContext 多种获取方式

ControllerBase 派生类中

ControllerBase 派生类中,我们可以直接通过 HttpContext 属性获取 HttpContext 对象。

通过注入 IHttpContextAccessor

Furion 框架中,默认已经注册了 IHttpContextAccessor 服务,所以我们可以通过构造函数注入该对象获取。

public class AppService
{
public AppService(IHttpContextAccessor httpContextAccessor)
{
var httpContext = httpContextAccessor.HttpContext;
}
}

通过 App.HttpContext

App 静态类也提供了 App.HttpContext 获取 HttpContext 对象。

HttpContext 拓展方法

Furion 框架也提供了一些常用的 HttpContext 拓展方法

获取当前请求的特性

var attribute = httpContext.GetMetadata<SomeAttribute>();

设置 Swagger 自动授权

httpContext.SigninToSwagger("你的token");

退出 Swagger 授权

httpContext.SignoutToSwagger();

获取本地 IP 地址

var ipv4 = httpContext.GetLocalIpAddressToIPv4();
var ipv6 = httpContext.GetLocalIpAddressToIPv6();

获取客户端 IP 地址

var ipv4 = httpContext.GetRemoteIpAddressToIPv4();
var ipv6 = httpContext.GetRemoteIpAddressToIPv6();
]]>
furion furos .net .netcore .net5 httpcontext