Net Core 2.x 跟 Net Core3.0 還是有很大的區別的,隨著.NET Core 3.1發佈,也就意味著老版本慢慢的要停止維護。 Net Core 3.0 其實就是過渡版本,用於我們練手。 ASP.NET Core 2.2 遷移到3.0:https://docs.microsoft. ...
.net core 3.1 今天已正式發佈,3.1跟3.0差別不是很大,主要是對 3.0一小部分修複和完善,最重要的是.NET Core 3.1是長期支持(LTS)版本,建議大家升級。
.net core 2.2 這個月就要停止維護,並且微軟將不再提供支持,如果你在使用 2.2 ,建議升級到 3.1,可以先升級到3.0,可以參考文檔:
ASP.NET Core 2.2 遷移到3.0:https://docs.microsoft.com/zh-cn/aspnet/core/migration/22-to-30?view=aspnetcore-3.0&tabs=visual-studio
如果在使用 2.1,可以暫時不用著急升級,2.1也是 LTS 版本
ASP.NET Core 3.0的新增功能:https://docs.microsoft.com/zh-cn/aspnet/core/release-notes/aspnetcore-3.0?view=aspnetcore-3.0
替換AutoFac服務
在 .Net Core 3.0 之前的時候,返回一個 IServiceProvider 註入到ConfigureServices服務中。
用 .Net Core 3.0 框架運行之後會報錯:ConfigureServices returning an System.IServiceProvider isn't supported.
找文檔之後發現 3.0 中 ConfigureServices 已經不支持返回 IServiceProvider 。
.Net Core 2.2的寫法
/// <summary> /// //負責註入服務 /// </summary> /// <param name="services"></param> /// <returns></returns> public IServiceProvider ConfigureServices(IServiceCollection services) { //初始化容器 var builder = new ContainerBuilder(); //管道寄居 builder.Populate(services); //業務邏輯層所在程式集命名空間 Assembly service = Assembly.Load("NetCoreDemo.Service"); //介面層所在程式集命名空間 Assembly repository = Assembly.Load("NetCoreDemo.Repository"); //自動註入 builder.RegisterAssemblyTypes(service, repository) .Where(t => t.Name.EndsWith("Service")) .AsImplementedInterfaces(); //註冊倉儲,所有IRepository介面到Repository的映射 builder.RegisterGeneric(typeof(Repository<>)) //InstancePerDependency:預設模式,每次調用,都會重新實例化對象;每次請求都創建一個新的對象; .As(typeof(IRepository<>)).InstancePerDependency(); //構造 ApplicationContainer = builder.Build(); //將AutoFac反饋到管道中 return new AutofacServiceProvider(ApplicationContainer); }
.Net Core 3.0的寫法
修改 Program.cs 將預設ServiceProviderFactory指定為AutofacServiceProviderFactory
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) //將預設ServiceProviderFactory指定為AutofacServiceProviderFactory .UseServiceProviderFactory(new AutofacServiceProviderFactory()) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); webBuilder.UseUrls("http://*:8004"); }); }
然後在 Startup.cs 中添加 ConfigureContainer 方法
使用ConfigureContainer訪問Autofac容器生成器,並直接向Autofac註冊。
public void ConfigureContainer(ContainerBuilder builder) { //業務邏輯層所在程式集命名空間 Assembly service = Assembly.Load("NetCoreDemo.Service"); //介面層所在程式集命名空間 Assembly repository = Assembly.Load("NetCoreDemo.Repository"); //自動註入 builder.RegisterAssemblyTypes(service, repository) .Where(t => t.Name.EndsWith("Service")) .AsImplementedInterfaces(); //註冊倉儲,所有IRepository介面到Repository的映射 builder.RegisterGeneric(typeof(Repository<>)) //InstancePerDependency:預設模式,每次調用,都會重新實例化對象;每次請求都創建一個新的對象; .As(typeof(IRepository<>)).InstancePerDependency(); }
參考:https://docs.autofac.org/en/latest/integration/aspnetcore.html#asp-net-core-3-0-and-generic-hosting