Autofac学习系列之-入门

Autofac学习系列之-入门Autofac 是什么 Autofac 是一种 IOC 容器 那么什么是 IOC 容器呢 先说一下两个概念 IOC 和 DI 我的理解 IOC 调用者不再创建 不自己 new 被调用者的实例 而是交给容器去创建 AutoFac 就充当这里的容器 这就是控制反转 DI 容器创建好的实例再注入调用者的过程 就是依赖注入 比如 属性注入 构造函数注入等 控制反转控制反转背后的核心思

Autofac是什么?

Autofac是一种IOC容器,那么什么是IOC容器呢?

先说一下两个概念IOC和DI,我的理解:

  ① IOC:调用者不再创建(不自己new)被调用者的实例,而是交给容器去创建(AutoFac就充当这里的容器),这就是控制反转。

  ② DI:容器创建好的实例再注入调用者的过程,就是依赖注入(比如:属性注入、构造函数注入等)。

控制反转

控制反转背后的核心思想是, 我们不再将类绑定在应用里,让类自己去 “new up” 他们的依赖, 而是反过来在类的构造方法中将依赖传递进去

Autofac入门

将Autofac整合到你的应用的基本模式如下:

  • 按照 控制反转 (IoC) 的思想构建你的应用.
  • 添加Autofac引用.
  • 在应用的 startup 处…
  • 创建 ContainerBuilder.
  • 注册组件.
  • 创建容器,将其保存以备后续使用.
  • 应用执行阶段…
  • 从容器中创建一个生命周期.
  • 在此生命周期作用域内解析组件实例.

构建应用

新建一个MVC应用如下

Autofac学习系列之-入门

Model层

using System; namespace AutoFac.Model { public class UserModel { public string UserId { get; set; } public string UserName { get; set; } public DateTime CreateDate { get; set; } } } 

Repository层

using AutoFac.Model; namespace AutoFac.Repository.IRepository { public interface IUserRepository { void AddUser(UserModel model); } } 
using AutoFac.Model; using AutoFac.Repository.IRepository; namespace AutoFac.Repository.Repository { public class UserRepository:IUserRepository { public void AddUser(UserModel model) { //do something } } } 

Service层

using AutoFac.Model; namespace AutoFac.Service { public interface IUser { void Add(UserModel model); } } 
using AutoFac.Model; using AutoFac.Repository.IRepository; namespace AutoFac.Service { public class User:IUser { private IUserRepository _userRepository; public User(IUserRepository userRepository) { this._userRepository = userRepository; } public void Add(UserModel model) { this._userRepository.AddUser(model); } } } 

Web层(注意引用)

using System.Reflection; using System.Web.Mvc; using Autofac; using Autofac.Integration.Mvc; using AutoFac.Repository.IRepository; using AutoFac.Repository.Repository; using AutoFac.Service; namespace AutoFacDemo.App_Start { public class AutoFacManager { public static void RegisterAutoFac() { var builder = new ContainerBuilder(); builder.RegisterControllers(Assembly.GetExecutingAssembly()); builder.RegisterType 
  
    ().As 
   
     ().InstancePerLifetimeScope(); builder.RegisterType 
    
      ().As 
     
       ().InstancePerDependency(); var container = builder.Build(); var resovler = new AutofacDependencyResolver(container); DependencyResolver.SetResolver(resovler); } } } 
      
     
    
  

控制器调用

using AutoFac.Model; using AutoFac.Service; using System.Web.Mvc; namespace AutoFacDemo.Controllers { public class HomeController : Controller { private IUser _user; public HomeController(IUser user) { _user = user; } public ActionResult Index() { var model = new UserModel(); model.UserId = "12312"; model.UserName = "测试"; _user.Add(model); return View(); } } }

 

现在当运行程序时…

  • Add方法手动地从生命周期中解析 IUser . (这就是 “服务定位.”) 在内部地…
    • Autofac发现 IUser 对应 User因此开始创建 User.
    • Autofac发现 User在它构造方法中需要一个 IUserRepostiory. (这就是 “构造方法注入.”)
    • Autofac发现 IUserRepostiory对应 UserRepostiory 因此开始创建新的 UserRepostiory实例.
    • Autofac使用新的 UserRepostiory实例完成 User 的创建.
    • Autofac返回完整构建的 User给”Add”使用.

注意: 通常来说, 服务定位模式大多情况应被看作是一种反模式  也就是说, 在代码中四处人为地创建生命周期而少量地使用容器并不是最佳的方式. 使用 Autofac 集成类库 时你通常不必做在示例应用中的这些事. 这些东西都会在应用的中心,”顶层”的位置得到解决, 人为的处理是极少存在的. 当然, 如何构建你的应用取决于你自身.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/219746.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午9:59
下一篇 2026年3月17日 下午9:59


相关推荐

  • 万能乘法速算法大全_玩转扑克牌亲子游戏大全收藏 孩子爱上数学 快速提升计算能力…「建议收藏」

    万能乘法速算法大全_玩转扑克牌亲子游戏大全收藏 孩子爱上数学 快速提升计算能力…「建议收藏」难得有时间陪孩子,莫老师教您几种扑克牌的玩法,给宅家生活提供一点小乐趣,轻松玩游戏的同时,增加乐趣,提升小孩的数感和反应能力,同时可以提高孩子的计算能力!电脑比较卡,花了一天的时间整理的游戏大全,好的东西记得收藏分享。认识扑克牌1、大、小王可以抽掉,或者指定当作数字几,也可以当作万能牌(抽到的人可以任意指定1-13中的任何一个数字)使用。把A、J、Q、K分别看作1点,11点、12点、13点,其余…

    2022年6月3日
    52
  • 用python给女朋友表白_python绘制太阳花

    用python给女朋友表白_python绘制太阳花python表白玫瑰花绘制——情人节表白搬运不易,路过的各位大佬请点个赞————————————————版权声明:本文主要参考CSDN博主「sunie」的文章,参考博文链接:https://blog.csdn.net/weixin_43387647/article/details/88973568python表白玫瑰花绘制——情人节表白python表白玫瑰花绘制——情人节表白一、玫瑰花绘制一二、玫瑰花绘制二三、玫瑰花绘制三四、桃花绘制一、玫瑰花绘制一fig=plt.figure()a

    2022年8月31日
    7
  • haxm failed to open driver

    haxm failed to open driver今天在新的PC机上,安装android环境。PC的配置是CPU:i5,8G内存。在装intelhaxm-android.exe时候出错(见下图)。尝试:首先,查看了BIOS中对VT的支持,确定是支持并且开启状态。然后在网上试了安装haxm_extra_workaround.zip的方式,仍然不起作用。解决办法:重新安装另外一个版本的HAXM,见网址。安装后,成功解决。

    2022年6月28日
    27
  • javaweb教务管理系统源码_java做一个学生管理系统

    javaweb教务管理系统源码_java做一个学生管理系统刚学完javaweb,做个项目练手与巩固所学的知识,同时分享自己写的这个教务管理系统,同样也是为自己记下笔记。为以后复习有帮助。该系统没有用到框架的知识,一共花了7天写出来。所以非常适合javaweb初学者教务管理系统javaweb项目运行环境:window系统,ApacheTomcatv7.0.84、JDK1.8开发环境:J2EEeclipse、navicatformysql运用的技术…

    2022年10月16日
    7
  • 白化Whitening

    白化Whitening白化操作的目的是让我们的减少冗余信息 准确来说通过白化操作我们有两个目的 每个特征之间关联性更少每个特征有相同的方差对于第一个目的来说 我们可以通过熟悉的 PCA 来实现 PCAPrincipal PCA 是一个用来减少特征纬度的算法 它通过减少特征的纬度来减少冗余信息 比如说 下图所示的一个特征纬度为 2 的点分类问题 我们可以看到数据的主要

    2026年3月18日
    2
  • git放弃修改&放弃增加文件

    git放弃修改&放弃增加文件

    2022年2月10日
    59

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号