• IOC容器-Autofac在MVC中实现json方式注入使用


    在你阅读时,默认已经了解IOC,依赖注入和基本用法,如果还有不懂的小伙伴你们可以去这个地址看看,https://www.bilibili.com/video/av7606481/?p=30,对于依赖注入讲解的很清楚!

    我在最近的我的项目中运用了IOC autofac 实现了依赖注入,由于我的项目是asp.net MVC 5 ,所以我目前向大家展示MVC中如何使用autofac

    首先在app_start中新建一个类包含以下方法:类名最好取名:AutofacConfig

    using System.Reflection;
    using Autofac;
    using Autofac.Integration.Mvc;
    using System.Web.Mvc;
    using Microsoft.Extensions.Configuration;
    using Autofac.Configuration;
    using Microsoft.Extensions.Configuration.Json;//有的小伙伴可能无法安装,因为他是仅支持.net framwork 4.6以上的版本,如果你使用4.6以下的版本,记得修改你的版本号,可以点击你的UI程序项目点击属性修改成4.6.1之后进行安装,安装完成后可以改回来哦!
    
    namespace SingleBlog.UI.App_Start
    {
        public class AutofacConfig
        {       
            public static void Register()//最好使用静态方法
            {
                //创建容器
                var builder = new ContainerBuilder();
    
                IConfigurationBuilder config = new ConfigurationBuilder();
                //使用json注册文件
                IConfigurationSource autofacJsonConfigSource = new JsonConfigurationSource()
                {
                    Path = "Autofac.json",
                    Optional = false,//boolean,默认就是false,可不写
                    ReloadOnChange = false,
                };
                //配置添加到autofac的configuration内中
                config.Add(autofacJsonConfigSource);
    
                //将json的文件配置注册到autofac的容器内
                var module = new ConfigurationModule(config.Build());
                builder.RegisterModule(module);
    
                //使用Autofac提供的RegisterControllers扩展方法来对程序集中所有的Controller注册
                builder.RegisterControllers(Assembly.GetExecutingAssembly());
    
                //创建一个Autofac的容器
                var container = builder.Build();
    
                //下面就是使用MVC的扩展 更改了MVC中的注入方式.
                DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
            }        
        }
    }

    这段代码的意思,就是从json文件中读取相应的注入内容!

    但是注意!程序集中该引用的必须要引用,我贴出了引用代码为了方便大家去寻找

    同时,创建一个根据autofac官网提示IOC的一个json文件,起名为Autofac.json,为了方便我直接放在了UI程序项目的根目录

    内容如下

    {
    //在Autofac的文档中可以设置默认程序集,此处就不设置了   "components": [   {     "type": "程序集.实现逻辑的类,你的实现类的程序集",     "services": [{"type": "接口所在的程序集.接口,接口所在程序集"}],     "autoActivate": true,//是否是自动注入     "injectProperties": true//是否使用属性注入   }
      后面可以接着写你的注入内容,注意每个实现的类和接口只能有一个对应的compoents! },.......后面可以复制粘贴了

    因为我是拿我的项目来介绍,这是根据DAL与IDAL的依赖注入,同理BLL和IBLL都可以,你可以接着写。

    这两个文件都是在MVC框架中即UI中,与IBLL和IDAL分离为了方便我放出我的项目图

    请注意!使用JSON注入需要你在UI项目下引用所有的DLL包括实现类的DLL!

    写好了之后,就是如何使用了

     但是在使用之前还必须得在你的项目启动类Global.asax中引用autofacconfig类,比如我的引用

    protected void Application_Start()
            {
                AreaRegistration.RegisterAllAreas();
                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
                RouteConfig.RegisterRoutes(RouteTable.Routes);
                AutofacConfig.Register();//直接调用静态方法
            }

    之后在项目的控制器中即可以使用BLL和DAL的方法,做到了依赖抽象而不用依赖细节

          private IArticleService _articleService;
            private IQQUserInfoService _qQUserInfoService;
            public IndexController(IArticleService ArticleService,IQQUserInfoService QQUserInfoService)//通过构造函数进行注入
            {
                this._articleService = ArticleService;
                this._qQUserInfoService = QQUserInfoService;
            }

    这是一个Index控制器,我申明私有的IBLL逻辑,在构造函数中注入进去后使用,即可以访问到BLL的实现逻辑

    但是注意在BLL如果要这样做的话,必须申明public类型的属性哦,不然不能使用哦!哦对了,前提你还得在JSON文件中表明你的类和你的接口是允许使用属性注入!

    使用这方法可以简单高效的进行IOC的依赖注入,使得你的项目更加的松耦合!

    对于泛型注入,官网的实例也有,但是不推荐进行JSON的泛型注入,应该在接口中定义泛型,然后在实现类继承的接口中直接指定类型去调用!

    autofac的使用介绍就到这里,如果还有不明白的,请探寻官网的原理和阅读该地址

    https://www.cnblogs.com/wolegequ/archive/2012/06/09/2543452.html

    该地址详细介绍了关于autofac的生命周期和特点

    本次实例很简单,希望某些大神可以给点关注,给点评价,菜鸟一枚,还望各位海涵,如有代码错误或者其他漏点,请与我联系,我将会及时改正,希望与博客园的各位大佬共同进步!每天学习一点点小知识!

  • 相关阅读:
    新一代MQ apache pulsar的架构与核心概念
    Flutter使用fluwx实现微信分享
    BZOJ3622 已经没有什么好害怕的了 动态规划 容斥原理 组合数学
    NOIP2016提高组Day1T2 天天爱跑步 树链剖分 LCA 倍增 差分
    Codeforces 555C Case of Chocolate 其他
    NOIP2017提高组Day2T3 列队 洛谷P3960 线段树
    NOIP2017提高组Day2T2 宝藏 洛谷P3959 状压dp
    NOIP2017提高组Day1T3 逛公园 洛谷P3953 Tarjan 强连通缩点 SPFA 动态规划 最短路 拓扑序
    Codeforces 873F Forbidden Indices 字符串 SAM/(SA+单调栈)
    Codeforces 873E Awards For Contestants ST表
  • 原文地址:https://www.cnblogs.com/sandaman2019/p/11273366.html
Copyright © 2020-2023  润新知