Autofac的基本使用---2、普通类型

本文介绍了Autofac的基本使用,包括在控制台程序和MVC中的使用流程,如集成进应用的基本模式、注册组件、生成容器实例等。同时提出了在MVC使用中的疑问,如注册Controller的作用、依赖关系解析的意义,还探讨了在ASP.NET Webform项目中的使用情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Autofac的基本使用---目录

 

Autofac使用---普通类型

使用的表是Student,创建相关的IDAL、DAL、IBLL、BLL层。

使用EF,创建一个Model层,存放edmx文件。

    

1、控制台程序的使用

using System;
using System.Collections.Generic;
using System.Linq; using System.Text; using System.Threading.Tasks; using Apps.BLL; using Apps.DAL; using Apps.IBLL; using Apps.IDAL; using Apps.Model; using Autofac; namespace Apps.Con { class Program { static void Main(string[] args) { #region 普通类型---Student // 创建组件/服务注册的容器 var builder = new ContainerBuilder(); // 注册类型公开接口 builder.RegisterType<StudentDAL>().As<IStudentDAL>(); builder.RegisterType<StudentBLL>().As<IStudentBLL>(); // 编译容器完成注册且准备对象解析 var container = builder.Build(); // 现在你可以使用 Autofac 解析服务. 例如,这行将执行注册的lambda表达式对于 IConfigReader 服务. //但是我们不推荐直接操作容器,这会导致内存泄漏。 //当我们解析出一个组件时,依赖于我们定义的lifetime scope,一个新的对象实例会被创建。 using (var scope = container.BeginLifetimeScope()) { //从容器中解析需要使用的组件 var iStudentBLL = scope.Resolve<IStudentBLL>(); //调用解析后的组件中的方法 List<Student> list = iStudentBLL.GetList().ToList(); Console.WriteLine("List中的数据行:"+list.Count); } #endregion #region 泛型类型---Teacher #endregion Console.ReadKey(); } } }

(1)使用流程

专业介绍:

参见:https://www.cnblogs.com/mantgh/p/5106149.html

将Autofac集成进你的应用的基本模式:

  • 在脑海中构造基于控制反转(IoC)的应用程序架构
  • 添加Autofac引用.
  • 在应用启动配置流程...
  • 创建一个 ContainerBuilder.
  • 注册组件(components).
  • build定义的ContainerBuilder生成Autofac容器,并存储它以供后续使用.
  • 在程序运行时...
  • 从Autofac容器(container)创建生命周期域(lifetime scope).
  • 使用生命周期域来解析出组件实例.

 自己理解:

a.参见Autofac管理注册类的容器实例

  var builder = new ContainerBuilder();

b.下面就需要为这个容器注册它可以管理的类型

  builder.RegisterType<StudentDAL>().As<IStudentDAL>();

c.生成具体的实例

  var container = builder.Build();

d.在应用运行期间,你需要从容器生命周期域中解析出组件实例来使用它们。

  using (var scope = container.BeginLifetimeScope())  {  }

e.从容器中解析需要使用的组件

  var iStudentBLL = scope.Resolve<IStudentBLL>();

f.调用解析出来的组件的方法

  List<Student> list = iStudentBLL.GetList().ToList();

 2、MVC中的使用

Index.cshtml

 

HomeController

 

using System;
using System.Collections.Generic;
using System.Linq; using System.Reflection; using System.Web; using System.Web.Mvc; using System.Web.Routing; using Apps.BLL; using Apps.DAL; using Apps.IBLL; using Apps.IDAL; using Apps.Web.Controllers; using Autofac; using Autofac.Integration.Mvc; namespace Apps.Web { public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); #region 普通类型---Student // 创建组件/服务注册的容器 var builder = new ContainerBuilder(); // 注册类型公开接口 builder.RegisterType<StudentDAL>().As<IStudentDAL>(); builder.RegisterType<StudentBLL>().As<IStudentBLL>(); 
       //方式1:单个Controller的注册(项目中有多少个Controller就要写多少次) builder.RegisterType<HomeController>().InstancePerDependency(); //方式2:使用Autofac提供的RegisterControllers扩展方法来对程序集中所有的Controller一次性的完成注册 //builder.RegisterControllers(Assembly.GetExecutingAssembly()); //生成具体的实例 var container = builder.Build(); //下面就是使用MVC的扩展 更改了MVC中的注入方式. DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); #endregion #region 泛型类型---Teacher #endregion } } }

 

前面两个Index.cshtml和HomeCotroller.cs只是数据的展示,所以被折叠起来。

重点在Global.asax中的配置。

(1)使用流程

自己理解

a.参见Autofac管理注册类的容器实例

  var builder = new ContainerBuilder();

b.下面就需要为这个容器注册它可以管理的类型

  builder.RegisterType<StudentDAL>().As<IStudentDAL>();

c.注册Controller,这个有两个方式。一、手动对项目中所有的Controller进行注册。二、使用Autofac的方法对程序集中所有的Controller一次性完成注册

  builder.RegisterType<HomeController>().InstancePerDependency();//手动注册单个

  builder.RegisterControllers(Assembly.GetExecutingAssembly());//自动注册全部

 

d.生成具体的实例

  var container = builder.Build();

e.依赖关系解析.就是使用MVC的扩展 更改了MVC中的注入方式.

  DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

3、存在的疑问

(1)MVC使用中多的步骤一,注册Controller控制器。且不注册的话,运行时会提示。这个步骤是做什么的?

(2)MVC中多的步骤二,依赖关系解析.添加了该步骤后,Controller中的组件配置为构造或属性注入(如下图配置为构造注入),

在程序运行时,申明的组件已经被实例化了。

省略了控制台程序中,去手动解析需要使用的组件

(3)MVC中免去了手动解析的步骤,那么在ASP.NET Webform项目中应该怎么使用呢?

公司的ASP.NET Webform项目中,使用的是Unity进行依赖注入。

使用步骤:

a.在Application_Start方法中进行注册

  UnityRegister.Register(Application);

b.详细代码

using System;
using System.Collections.Generic;
using System.Linq; using System.Web; using Microsoft.Practices.Unity; namespace BF.Web.App_Code { public class UnityRegister { public static void Register(HttpApplicationState Application) { IUnityContainer unityContainer = new UnityContainer(); //注册关系 unityContainer.RegisterType<IIcCardLogBLL, IcCardLogBLL>(new HttpContextLifetimeManager<IIcCardLogBLL>()); unityContainer.RegisterType<IIcCardLogDAL, IcCardLogDAL>(new HttpContextLifetimeManager<IIcCardLogDAL>()); //将配置信息保存到Application Application.Add("UnityContainer", unityContainer); } } }

 

 c.使用时

  IIcCardLogBLL iIcCardLogBLL= IOCFactory.GetIOCResolve<IIcCardLogBLL>();

d.详细代码

using System;
using System.Collections.Generic;
using System.Linq; using System.Text; using Microsoft.Practices.Unity; using System.Web; using System.Configuration; using Microsoft.Practices.Unity.Configuration; namespace BF.UnityFactory { public static class IOCFactory { public static T GetIOCResolve<T>() { if (HttpContext.Current.Application["UnityContainer"] != null && HttpContext.Current.Application["UnityContainer"] != "") { //从Application获取容器 IUnityContainer ioc = HttpContext.Current.Application["UnityContainer"] as UnityContainer; //从容器中解析组件 return ioc.Resolve<T>(); } else { throw new Exception("IOC容器初始化发生错误!"); } } } }

 (4)在MVC中尝试上面的方法,修改HomeController 和Application_Start的代码

Application_Start
HomeController

运行结果:

同样能获取到数据。

注意:Application_Start中没有进行Controller的注册和依赖关系解析这两步操作,。

但是,个人感觉这样处理不是太合适。

第一,将数据保存在Application中,是不是存在数据丢失和安全的问题。

第二,在使用时,还是需要调用公用去解析组件。

总之,不如使用上面MVC自带的方法处理的方便和简洁。

转载于:https://www.cnblogs.com/masonblog/p/9563093.html

任务中心 当前任务列表,单击可以进入任务中心 公司公告 显示公告列表,没有阅读的公告,加大加粗,显示颜色,点开后,失去未读特征 本日签到和签退 显示本日登录时间和本日最后在系统的时间 本日任务进度 饼状图 在建项目总进度 多行日期折现图模式 提醒便签 个人随时记录的提醒功能 汇总模式:单独一个首页,数据为上述功能的汇总和统计 文件与共享 文件区 可以上传和下载文件,记录文件名称,时间,关联项目,关联类别等信息。可以搜索。文件根据对应扩展名不同,显示不同图标,自己上传的文件可以修改类别,名称,描述等新奇。 文件单击可以下载。 文件分为共享区和私有区,分为左右结构,单击图标,有动画过渡,可以显示共享或者私有区域。 项目管理 项目立项 记录项目的名称,建立时间,完结时间,状态,基本描述,备注等信息 项目分析 为项目配置,大的模块,小的模块,功能点和对应的描述信息。可以导出本文档对应的格式 docx(不包括图片)。 报价模式 可以配置需求工时和单价,可以配置公式自动生成,也可以手动填写。 项目分配和计划 根据项目和人员进行分配和排期,每个单元格可以单选和多选分配给人员任务。可以导出对应xlsx格式 分配的任务进入任务中心 项目进度 展示和下载两种文档模式的进度 任务中心 任务清单 任务分为周计划和指派任务 所有人可以申请任务,默认的责任人为申请人。 任务包括名称,内容,开始时间,结束时间,任务关联项目,任务类型,申请人,附件等信息 可以设置任务进入初审状态并提交,该任务将由管理员指派人员进入任务测试阶段。 任务可以由执行人设置百分比进度。 测试人完成测试任务后,提交状态为终审。管理员可以将状态设置完成或者驳回。 驳回(定义为缺陷)后,任务人将再次完善任务。提交审核流程。 每一个流程均记录在任务的详细流程中,每个流程,均需要添加备注 根据流程和状态生成流程图。 任务申请后,不可修改,默认为待审核状态,管理员可以修改并分配给对应人员。 管理员额外可以查看到完成任务的实际时间和设置工时(数字类型) 当前任务 按照人员列举,当前所有人员任务列表,鼠标点击显示完整任务信息 任务统计 按照人员项目时间段筛选 统计人员完成任务信息以及工时统计和实际耗时统计 显示并可导出 工时报表 需求报表 缺陷报表 系统配置 管理员管理 可以设定管理员的账号密码以及角色信息 部门管理 可以设定公司的部门信息 角色管理 设定不同的角色名称,用来区分权限功能 角色权限配置 为不同的角色配置不同权限 系统字典类型数据配置 用来配置系统中所有使用的字典数据类型参数,例如事件的处理状态,该功能内置。 出勤管理 可以设定上班下班和加班下班时间点 可以进行搜索,包括普通模式和汇总模式 普通模式:显示各个帐号每天的在线时长明细,如果该天出现多次不同IP,记录不同IP,并标记异常。 汇总模式:显示各个帐号统计的在线时长和出勤天数 单击名字可以按照月度查看出勤情况,并可以在日历上显示和标注,事假和病假调休等事件。 通讯录 记录公司人员相关电话,微信号,应急联系人名字和电话,以及其他相关通讯信息例如物业,水电。 公告系统 新闻类型,可以发布和审核公告信息,显示已经阅读列表 公司制度 新闻类型,可以发布和修改信息,制度带有编号 操作规范 新闻类型,可以发布和修改信息,带有编号 物资系统 物资包括虚拟和真实,每一个物资对应唯一编号,例如一次引进4把椅子,4把椅子各自有自己的编号。 物资的状态可以扩展,包括不限制于,购买,在用,损坏,支出。 物资的购买,需要可以按照时间段统计,总金额,和各状态分类统计 物资的在用和支出,物资可以分配给员工,项目,公司来实现在用状态。 系统参数 系统基本参数配置,配置系统内常用参数,应为可能发生变化的参数点。 系统日志 记录人员和系统操作的历史 使用net6以上,EF+webApi+vue+ele前后端 帮我写个全部的
最新发布
03-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值