1. 首页
  2. 文章列表
  3. Autofac在.NET Core中的属性注入

之前写过一篇文章深入浅出依赖注入容器——Autofac,autofac的基本功能算是都会用了,但是最近在迁移博客项目到.NET Core的时候,因为其中有部分代码是属性注入的方式,autofac本身是基于.NET Standard的,原以为代码原封不动搬过来肯定是可以用的,结果跑起来的时候发现,属性注入没生效,所以开始一番研究,最终发现还要多写两行代码才能解决这样的问题。

光说肯定是不够的,接下来还是上代码,还原解决问题的步骤。

首先我们按部就班的创建一个.NET Core的项目,并且引入autofac的nuget包:Autofac.Extensions.DependencyInjection和Autofac;

创建一个类,用于模拟需要依赖注入的对象:UserInfoService.cs,和对应的接口IUserInfoService.cs

public interface IUserInfoService
{
    string[] GetUsers();
}
public class UserInfoService : IUserInfoService
{
    public string[] GetUsers()
    {
        return new[] { "张三", "李四" };
    }
}

创建一个控制器HomeController.cs,属性引入IUserInfoService,然后在一个Action里调用GetUsers方法

public class HomeController : Controller
{
    public IUserInfoService UserInfoService { get; set; }
    public IActionResult Index()
    {
        return Ok(UserInfoService.GetUsers());
    }
}

在Startup.cs中配置依赖注入

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    ContainerBuilder builder = new ContainerBuilder();
    builder.Populate(services);
    builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).AsImplementedInterfaces().Where(t => t.Name.EndsWith("Service")).PropertiesAutowired().AsSelf().InstancePerDependency();
    return new AutofacServiceProvider(builder.Build());
}

别问我.NET Core已经自带依赖注入了为什么还要用autofac,因为自带的不能属性注入和批量注入啊,我就是喜欢这么骚的写法!

原以为这样就能和.NET Framework一样,直接可以跑起来,但是,它给我报了一个错

懒得勤快的博客_互联网分享精神

空引用异常,这明显是没注入进去,如果加上构造函数,这肯定是可以的,这不用说

public class HomeController : Controller
{
    public IUserInfoService UserInfoService { get; set; }

    public HomeController(IUserInfoService userInfoService)
    {
        UserInfoService = userInfoService;
    }
    public IActionResult Index()
    {
        return Ok(UserInfoService.GetUsers());
    }
}

懒得勤快的博客_互联网分享精神

那就上官网看下文档吧,找了半天,在文档里看到了这么两句代码;

services.AddMvc().AddControllersAsServices();
builder.RegisterType<HomeController>().AsSelf().PropertiesAutowired().InstancePerDependency();

大致意思是将Controller注册为服务容器,然后试了一下,它真就可以了,于是,最后将代码改成了这样,便于批量注入

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2).AddControllersAsServices();
    ContainerBuilder builder = new ContainerBuilder();
    builder.Populate(services);
    builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).AsImplementedInterfaces().Where(t => t.Name.EndsWith("Service")).PropertiesAutowired().AsSelf().InstancePerDependency();
    builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).AsImplementedInterfaces().Where(t => t.Name.EndsWith("Controller")).PropertiesAutowired().AsSelf().InstancePerDependency(); //注册控制器为属性注入
    return new AutofacServiceProvider(builder.Build());
}


分享到:

DIY电竞显示器,27/32寸显示器,2k/4k/165Hz/IPS/gsync [推广]

DIY电竞显示器,27/32寸显示器,2k/4k/165Hz/IPS/gsync

对标四大金刚,价格2000人民币左右,感兴趣的私我。 本站自营超高性价比的diy显示器,对标大金刚,小金刚等,一半的价格,完美的体验,M270KCJ-K7B,M270DAN02.6,LM315WR1-SSB1,M270QAN02.3。

相关推荐:

深入浅出依赖注入容器——Autofac 浅谈http断点续传的原理以及.NET代码实现,看似挺高端,其实很简单
AutoMapper 10.0快速上手体验,以及如何从AutoMapper老版本迁移到10.0+AutoMapper10.0和Autofac的完美结合 一些小众冷门但却非常实用的.NET(Core)开源库推荐
零度分享.NET Core2.2微服务入门实战教程 奉献两套Asp.Net Core最新视频教程
解决ASP.NET Core MVC的Razor视图渲染中文乱码的问题 博主开源项目——本站博客项目MyBlogs.Core,基于.NET Core 3.1
ASP.NET Core中使用拦截器实现一个简单的WAF防火墙 博主开源项目——基于EntityFrameworkCore和Lucene.NET实现的全文搜索引擎库

版权声明:

🈲⚠本文为作者原创,仅用于本站访客学习、研究和交流目的,未经授权禁止转载。️⚠🈲

评论区: