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());
}


分享到:

版权声明:

本文仅用于学习、研究和交流目的,欢迎非商业性质转载。本文链接:https://masuit.com/1435

l  博主在此发文(包括但不限于汉字、拼音、拉丁字母)均为随意敲击键盘所出,用于检验本人电脑键盘录入、屏幕显示的机械、光电性能,并不代表本人局部或全部同意、支持或者反对观点。如需要详查请直接与键盘生产厂商法人代表联系。挖井挑水无水表,不会网购无快递。

l  文章内容部分来源于互联网,不代表本人的任何立场;涉及到的软件来源于互联网,仅供个人下载使用,请勿用于商业用途,版权归软件开发者所有,下载后请于24小时内删除,如有真实需要请支持正版!因下载本站任何资源造成的损失,全部责任由使用者本人承担!如果你是版权方,认为本文内容对您的权益有所侵犯,请联系博主,并参照侵删联系的说明提交相应的证明材料,待博主进行严格地审查和背景调查后,情况属实的将在三天内将本文删除或修正。

l  博主的文章没有高度、深度和广度,只是凑字数。由于博主的水平不高(其实是个菜B),不足和错误之处在所难免,希望大家能够批评指出。

l  博主是利用读书、参考、引用、抄袭、复制和粘贴等多种方式打造成自己的纯镀 24k 文章,请原谅博主成为一个无耻的文档搬运工!

l  博主只是一名普通的互联网从业者,不会帮你盗号,不懂破解开机密码,找不回你丢失的手机等,如有这样的想法我也帮你实现不了!

相关推荐:

由double类型判等引发的一点小思考 解决ASP.NET Core MVC的Razor视图渲染中文乱码的问题
IIS通过URL重写将www的域名301到不带www的域名和强制使用https访问网站 AutoMapper 6.x起步
浅谈EF中LINQ查询原理 深入浅出依赖注入容器——Autofac
C# vs Java:C# 五个不可替代的特性瞬间秒杀 Java 谈一谈单例模式、静态类和线程内唯一对象有什么区别
.NET/java Office组件神器——Aspose.Total 17.x/18.x破解版+破解补丁下载 ASP.NET Core SignalR 实时推送框架简单入门教程+服务端主动推送案例

评论区: