在 .NET6/C#10
之后,微软新增了 GlobalUsings
机制,可以在项目的根目录下创建一个 GlobalUsings.cs
文件,把常用的 using
放置其中。
这样 GlobalUsings.cs
所在的项目 .cs
文件就无需重复 using
了,大大的提高开发效率,也让代码变的更加简洁。
启用 GlobalUsings
机制需要以下两个步骤:
using
的项目层根目录创建 GlobalUsings.cs
文件,如果多个项目层需要,则每个层都应该有一个 GlobalUsings.cs
.csproj
文件,添加 <ImplicitUsings>enable</ImplicitUsings>
,注意是在 <PropertyGroup>
中添加,通常和 <TargetFramework>
同父同级配置之后,现在就可以把常用的 using
放到 GlobalUsings.cs
中了,写法如下:
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
中了,微软会在编译时自动合并。
.NET 6 Preview 7
版本,Furion
在当天第一时间适配了该版本,并发布 Furion v3.0.0-rc.2
版本。
.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>
。
同时升级所有 Microsoft
和 Furion
包为最新版本,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
打开浏览器查看效果即可。
]]>当前内容已过时,请查看 2.1 入门指南 - 2.1.10.3 Console
初始化
Furion
从 v2.15.3+
版本开始,支持全平台应用程序开发,包括 Web
,控制台
,WinForm
,WPF
,Xamarin/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()
即可完成初始化。
.NET 6 Preview 6
版本,Furion
在当天第一时间适配了该版本,并发布 Furion v3.0.0-rc.1
版本。
.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>
。
同时升级所有 Microsoft
和 Furion
包为最新版本,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
打开浏览器查看效果即可。
]]>.NET 6 Preview 5
版本,Furion
在当天第一时间适配了该版本,并发布 Furion v3.0.0-preview.5.21301.9
版本。
.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
打开浏览器查看效果即可。
]]>[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请求配置
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);
});
在 ASP.NET
的时代,我们通常通过 HttpContext
全局静态类获取请求上下文,但在 ASP.NET Core
中,HttpContext
是一个非静态的抽象类,无法手动创建,也无法通过静态获取。
虽然在 ASP.NET Core
中无法直接获取 HttpContext
对象。但是微软也提供了注入 IHttpContextAccessor
方式获取。
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();
var ipv4 = httpContext.GetLocalIpAddressToIPv4();
var ipv6 = httpContext.GetLocalIpAddressToIPv6();
var ipv4 = httpContext.GetRemoteIpAddressToIPv4();
var ipv6 = httpContext.GetRemoteIpAddressToIPv6();