.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的写法
/// /// //负责注入服务/// /// /// 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();
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
作者:tenghao
出处:https://www.cnblogs.com/tenghao510/
版权申明:本文来源于网友收集或网友提供,如果有侵权,请转告版主或者留言,本公众号立即删除。