Intro
之前我们在 ASP.NET Core 6 Minimal API 中曾经提到过现在我们还是需要手动加命名空间引用,在以后的版本中可能就不需要手动加命名空间的引用了,确实是的。
今天看到一个更新,可以不需要写 using
了,目前还没有正式发布,应该要到 .NET 6 Preview 7 才会支持。
Sample
还是以我们之前的 Minimal API 为例子
之前我们的示例可能是这样的:
using Microsoft.AspNetCore.Builder;
var app = WebApplication.Create(args);
app.Map("/", () => "Hello World");
app.Run();
或者结合 global using
之后把 using
放在一个单独的 Imports
文件中,
Imports:
@global using Microsoft.AspNetCore.Builder;
Program:
var app = WebApplication.Create(args);
app.Map("/", () => "Hello World");
app.Run();
在 .NET 6 Preview 7 中,我们将不需要再加 using
了,Preview 7 会包含一个新的特性——“隐式命名空间引用”,这个特性将会默认为你的项目添加常用的命名空间,我们就可以不再需要上面的 Imports
了
How it works
它的实现方式也是基于之前的 global using
特性来实现的,编译器会根据 MS Build 中配置的命名空间生成一个 global using
的文件,就像上面的 Imports
目前针对不同的 SDK 类型会添加不同的默认 namespace,目前已有的如下:
针对 Microsoft.NET.Sdk
,默认的命名空间如下:
System
System.Collections.Generic
System.IO
System.Linq
System.Net.Http
System.Threading
System.Threading.Tasks
针对 Microsoft.NET.Sdk.Web
System.Net.Http.Json
Microsoft.AspNetCore.Builder
Microsoft.AspNetCore.Hosting
Microsoft.AspNetCore.Http
Microsoft.AspNetCore.Routing
Microsoft.Extensions.Configuration
Microsoft.Extensions.DependencyInjection
Microsoft.Extensions.Hosting
Microsoft.Extensions.Logging
针对 Microsoft.NET.Sdk.Worker
Microsoft.Extensions.Configuration
Microsoft.Extensions.DependencyInjection
Microsoft.Extensions.Hosting
Microsoft.Extensions.Logging
如果你想禁用隐式命名空间引用,可以通过 DisableImplicitNamespaceImports
来完全禁用这个功能
<DisableImplicitNamespaceImports>true</DisableImplicitNamespaceImports>
如果你只是想禁用针对 Microsoft.NET.Sdk.Web
的引用则可以配置 DisableImplicitNamespaceImports_Web
<DisableImplicitNamespaceImports_Web>true</DisableImplicitNamespaceImports_Web>
配置对应关系:
SDK | PropertyName |
---|---|
Microsoft.NET.Sdk | DisableImplicitNamespaceImports_DotNet |
Microsoft.NET.Sdk.Web | DisableImplicitNamespaceImports_Web |
Microsoft.NET.Sdk.Worker | DisableImplicitNamespaceImports_Worker |
后面应该会有更多的支持,具体还是要以最终 .NET6 正式发布时为准
我们也可以为我们的 library 启用 global using
的功能,这样在使用的时候也可以不加 using 直接使用
只需要打包的时候在项目文件中增加一个类似下面的 property 到项目里即可,微软的大佬在这里有一个很好的示例 https://github.com/JunTaoLuo/GlobalUsings:
<Project>
<ItemGroup>
<GlobalUsings Include="Library" />
</ItemGroup>
</Project>
More
隐式命名空间引用能够使得我们避免写特别多重复的命名空间引用,对于简单的测试应用来说会非常的方便
虽然隐式的命名空间引用能够为我们大大简化代码,不需要再写重复的 using
代码,但是也有可能会对代码造成冲突,比如自己定义的一个类,在自己的命名空间下和默认隐式引用的命名空间下都存在,此时就会造成冲突,如果不能移除默认的命名空间引用,那使用的时候就需要使用完全限定名或者别名可能会有点不太方便
References
- https://github.com/dotnet/docs/issues/25066
- https://github.com/dotnet/core/issues/6444
- https://github.com/dotnet/sdk/pull/18459
- https://github.com/JunTaoLuo/GlobalUsings