文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

ASP.net core怎么使用Autofac实现泛型依赖注入

2023-06-30 12:08

关注

本文小编为大家详细介绍“ASP.net core怎么使用Autofac实现泛型依赖注入”,内容详细,步骤清晰,细节处理妥当,希望这篇“ASP.net core怎么使用Autofac实现泛型依赖注入”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

什么是泛型依赖注入

创建两个带泛型的类,并配置两者的依赖关系,对于继承这两个类的子类,如果泛型相同,则会继承这种依赖关系: 

ASP.net core怎么使用Autofac实现泛型依赖注入

如上图: 

定义了两个泛型base类:BaseService和BaseRepository 

对于UserService和UserRpository分别继承两个base类,泛型都是User,则他们俩继承了父类的依赖关系。

.net core里实现泛型依赖注入

安装Autofac

ASP.net core怎么使用Autofac实现泛型依赖注入

先看项目结构

ASP.net core怎么使用Autofac实现泛型依赖注入

IMyRepository定义仓储接口

    public interface IMyRepository<T> where T: class    {        string GetTypeof();    }

MyRepositoryBase仓储实现

    public class MyRepositoryBase<T> : IMyRepository<T> where T : class    {        public string GetTypeof()        {            return typeof(T).Name; //通过typeof可以知道泛型的名字        }    }

CustomAutofacModule 公共的依赖注入类

    public class CustomAutofacModule : Module    {         public CustomAutofacModule(ContainerBuilder builder) {                   }        /// <summary>        /// AutoFac注册类        /// </summary>        /// <param name="builder"></param>        protected override void Load(ContainerBuilder builder)        {            builder.RegisterGeneric(typeof(MyRepositoryBase<>)).As(typeof(IMyRepository<>)).InstancePerDependency();//注册仓储泛型//builder.RegisterGeneric(typeof(MyRepositoryBase<,>)).As(typeof(IMyRepository<,>)).InstancePerDependency();//注册仓储泛型 2个以上的泛型参数         //  builder.RegisterType<myAssembly>().As<ImyAssembly>();   //普通依赖注入        }    }

在Program声明实现依赖注入

ASP.net core怎么使用Autofac实现泛型依赖注入

    public class Program    {        public static void Main(string[] args)        {             CreateHostBuilder(args).Build().Run();        }         public static IHostBuilder CreateHostBuilder(string[] args) =>            Host.CreateDefaultBuilder(args)                //改用Autofac来实现依赖注入                .UseServiceProviderFactory(new AutofacServiceProviderFactory())                .ConfigureWebHostDefaults(webBuilder =>                {                    webBuilder.UseStartup<Startup>();                });    }

修改Startup

运行时候触发CustomAutofacModule

    public class Startup    {        public Startup(IConfiguration configuration)        {            Configuration = configuration;        }         public IConfiguration Configuration { get; }        //autofac 新增        public ILifetimeScope AutofacContainer { get; private set; }         public void ConfigureServices(IServiceCollection services)        {             services.AddControllers();          }         public void ConfigureContainer(ContainerBuilder builder)        {            // 直接用Autofac注册我们自定义的             builder.RegisterModule(new CustomAutofacModule(builder));        }               public void Configure(IApplicationBuilder app, IWebHostEnvironment env)        {            if (env.IsDevelopment())            {                app.UseDeveloperExceptionPage();            }            //autofac 新增             this.AutofacContainer = app.ApplicationServices.GetAutofacRoot();              app.UseRouting();             app.UseAuthorization();             app.UseEndpoints(endpoints =>            {                endpoints.MapControllers();            });        }    }

在Home控制器中使用

    [ApiController]    [Route("[controller]")]    public class HomeController : ControllerBase    {        //public IMyRepository<User> _UserServer { get; set; }        private readonly IMyRepository<User> _UserServer;        private readonly IMyRepository<Role> _RoleServer;        public HomeController(IMyRepository<User> UserServer, IMyRepository<Role> RoleServer)        {            _UserServer = UserServer;            _RoleServer = RoleServer;        }               [Route("Get")]        public string Get() {            return _UserServer.GetTypeof();//"user"; //        }              [Route("GetRole")]        public string GetRole()        {            return _RoleServer.GetTypeof();//"role"; //        }     }

可以看到 不同的地方实现不同的对象

ASP.net core怎么使用Autofac实现泛型依赖注入

ASP.net core怎么使用Autofac实现泛型依赖注入

  番外:

我是因为看到ABP框架的IRepository的实现才研究泛型依赖注入的用法的。

ABP框架吧Autofac已经 封装为IocManager 了

所以ABP框架不需要 引入Autofac框架。只需要在对应的XXXCoreModule 中的Initialize()方法声明依赖注入便可

IocManager.Register(typeof(IMyRepository<>), typeof(MyRepositoryBase<>), DependencyLifeStyle.Transient);

ASP.net core怎么使用Autofac实现泛型依赖注入

如果是2个以上的泛型写法是

 IocManager.Register(typeof(IAmbientScopeProvider<,>), typeof(DataContextAmbientScopeProvider<,>), DependencyLifeStyle.Transient);

 DependencyLifeStyle.Transient 的作用

Transient :瞬态,要么作用域是整个进程,要么作用域是一个请求,而这里的 Transient 就没有作用域概念了,注入一次 实例化一次 最明显的区别,属性注入是不可用的,只能构造函数注入

Singleton:可以在你的进程中保持着一个实例,也就是说仅有一次实例化 最明显的区别,属性注入是可用的

  番外2:

看到了很多教程是不用声明CustomAutofacModule类的直接在Startup声明依赖注入就可以的。但是那是core 2.0的写法。core 3.0 下面的写法是会报错的

public static IContainer AutofacContainer;// This method gets called by the runtime. Use this method to add services to the container.public IServiceProvider ConfigureServices(IServiceCollection services){    //注册服务进 IServiceCollection    services.AddMvc();    ContainerBuilder builder = new ContainerBuilder();    //将services中的服务填充到Autofac中.    builder.Populate(services);    //新模块组件注册    builder.RegisterModule<DefaultModuleRegister>();    //创建容器.    AutofacContainer = builder.Build();    //使用容器创建 AutofacServiceProvider     return new AutofacServiceProvider(AutofacContainer);}

读到这里,这篇“ASP.net core怎么使用Autofac实现泛型依赖注入”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯