ASP.NET Core 3 中使用 Autofac的属性注入

2021-04-03  乐帮网

netcore autofac

这里介绍如何在ASP.NET Core 3.0以后使用属性注入,和以往的Net core2.0完全不同,如何按钮以前的方法启用注入的话肯定不生效。通过网上学习和从官网查看,特总结了在 Net Core3.0下启用属性注入的方法。这里我们使用MVC为例进行说明,Razor Pages 项目也是一样的,没有区别。

首先基础知识可以参考官网:https://autofaccn.readthedocs.io/en/latest/integration/aspnetcore.html
下面开始我们的注入旅。

(1)新建一个Net Core的MVC项目,并引入两个Nuget包。

Autofac
Autofac.Extensions.DependencyInjection
我是直接安装的最新版 autfac 6.1 

(2)修改Program文件
添加UseServiceProviderFactory(new AutofacServiceProviderFactory())

public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                }).UseServiceProviderFactory(new AutofacServiceProviderFactory());

(3)建立一个测试用映射类 IUserRepository 和 UserRepository 

public class UserModel
    {
        public string Name { get; set; }
    }
public interface IUserRepository
    {
        public UserModel GetOne();
    }
  public class UserRepository : IUserRepository
    {
        public UserModel GetOne()
        {
            return new UserModel {Name= "Timmy" };
        }
    }

(4)新建映射配置类

//https://lebang2020.cn/details/2104035qtvwy0z.html
 public class AutofacConfigModule : Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            builder.RegisterType<UserRepository>().As<IUserRepository>();
     var controllersTypesInAssemblyTypes = typeof(Program).Assembly.GetExportedTypes().Where(type => typeof(ControllerBase).IsAssignableFrom(type)).ToArray();
            builder.RegisterTypes(controllersTypesInAssemblyTypes).PropertiesAutowired();
        }
    }

(5)修改Startup文件

添加 AddControllersAsServices

 public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews().AddControllersAsServices();
        }

添加配置方法

 public void ConfigureContainer(ContainerBuilder builder)
        {
            builder.RegisterModule(new AutofacConfigModule());
        }

(6)验证注入在HomeController中添加属性

   public IUserRepository UserRepository{ get;set;}
 public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;

        public IUserRepository UserRepository { get; set; }

        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        public IActionResult Index()
        {
            var user = UserRepository.GetOne();
            return View();
        }

        public IActionResult Privacy()
        {
            return View();
        }

        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }
    }

最后运行调试,就发现能正常运行了。

同时提供示例代码下载,链接:https://pan.baidu.com/s/1XTwNVXckrHpi6Ss1O0JSiQ 

公众号二维码

关注我的微信公众号
在公众号里留言交流
投稿邮箱:1052839972@qq.com

庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。

欧阳修

付款二维码

如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力