ASP.NET MVC中使用Autofac实现简单依赖注入

本文参考资料:

1、https://www.cnblogs.com/RayWang/p/11128554.html。

2、https://www.cnblogs.com/eedc/p/6127181.html

3、https://www.cnblogs.com/ancupofcoffee/p/5007649.html#top

前言 

关于IoCDI(依赖注入)的概念网上一搜一大把。简单来说,IoC即“控制反转”,是一种设计原则,一个抽象的概念。而依赖注入是实现IoC的一种设计。DI容器有很多,比如Unity、Autofac等。利用DI容器,可以将代码解耦,高分离度的代码将更有利于维护。利用上述参考资料,文本将依样画葫芦,实现一个简单的DI案例。


项目结构 

   

项目名称类型框架
Wangxc.AutoFac.Infrasturacute.IocDI Framework 容器库类.NET FrameWork 4.6
Wangxc.AutoFac.Model实体层库类.NET FrameWork 4.6
Wangxc.AutoFac.Repository仓储层库类.NET FrameWork 4.6
Wangxc.AutoFac.Service业务逻辑层库类.NET FrameWork 4.6
Wangxc.AtuoFac.MvcApp.NET Framework MVC主程序ASP.NET MVC 项目.NET FrameWork 4.6
一般三层架构
名称职责举例
界面层负责展示数据StudentController
业务逻辑层负责业务逻辑StudentService
数据访问层负责数据访问StudentRepository
面向接口后的架构
名称职责举例
界面层UI负责展示数据StudentController
业务逻辑抽象层 (Ineterface BLL)业务逻辑运算抽象接口IStudentService
业务逻辑层 (BLL)业务逻辑运算StudentServcie
数据访问抽象层 (InterfaceDAL)数据访问抽象接口IStudentRepository
数据访问层 (DAL)负责提供数据StudentRepository

 

 

 

 

 

     

 


项目具体实现 

实体层

namespace Wangxc.AutoFac.Model
{public class StudentEntity{public int Id { get; set; }public string Name { get; set; }public string Grade { get; set; }}
}

 

仓储层

namespace Wangxc.AutoFac.Repository.IRepository
{public interface IStudentRepository{string GetName(int id);}
}
using Wangxc.AutoFac.Repository.IRepository;namespace Wangxc.AutoFac.Repository.Repository
{public class StudentRepository : IStudentRepository{public string GetName(int id){switch (id){case 3: return "张三";case 4: return "李四";case 5: return "王五";default:return "赵六";};              }}
}

 

逻辑层:

namespace Wangxc.AutoFac.Service.IService
{public interface IStudentService{string GetName(int id);}
}
using Wangxc.AutoFac.Service.IService;
using Wangxc.AutoFac.Repository.IRepository;namespace Wangxc.AutoFac.Service.Service
{public class StudentService : IStudentService{private readonly IStudentRepository _studentRepository;public StudentService(IStudentRepository studentRepository){this._studentRepository = studentRepository;}public string GetName(int id){return this._studentRepository.GetName(id);}}
}

 

AutoFac IoC容器层: 

通过NuGet程序包引入Autofac包:

         

通过NuGet程序包引入Autofac mvc5 程序包: 

        

新建类文件MvcContainer.cs用于注册批量对象: 

                       

using System;
using System.Linq;
using Autofac;
using Autofac.Integration.Mvc;
using System.Reflection;namespace Wangxc.AutoFac.Infrasturcture.Ioc
{public static class MvcContainer{public static IContainer Instance;public static System.Web.Mvc.IDependencyResolver Init(Func<ContainerBuilder, ContainerBuilder> func = null){var builder = new ContainerBuilder();//新建容器用于注册组件MyBuild(builder);//注册组件func?.Invoke(builder);Instance = builder.Build();//利用构建器创建容器return new AutofacDependencyResolver(Instance);//返回针对MVC的解析器}public static void MyBuild(ContainerBuilder builder){//注册仓储层Assembly repositoryAssembly = Assembly.Load("Wangxc.AutoFac.Repository");builder.RegisterAssemblyTypes(repositoryAssembly).PublicOnly()   //只要public访问权限的.Where(cc => cc.IsClass)    //只要class类型的(排除值和interface类型).AsImplementedInterfaces(); //自动以其实现的接口暴露(包括Dispose接口)//注册逻辑层Assembly serviceAssembly = Assembly.Load("Wangxc.AutoFac.Service");builder.RegisterAssemblyTypes(serviceAssembly).PublicOnly().Where(cc => cc.IsClass).AsImplementedInterfaces();Assembly MvcAssembly = Assembly.Load("Wangxc.AutoFac.MvcApp");builder.RegisterControllers(MvcAssembly);//注册MVC项目中的Controller}}
}

MVC项目UI层:

通过NuGet程序包引入Autofac包:

                              

 

         

Global.asax.cs中添加如下代码: 

        

新增StudentController.cs控制器用于测试Autofac是否搭建成功,如下图所示为构造函数注入: 

using System.Web.Mvc;
using Wangxc.AutoFac.Service.IService;namespace Wangxc.AutoFac.MvcApp.Controllers
{public class StudentController : Controller{private readonly IStudentService _studentService;public StudentController(IStudentService studentService){this._studentService = studentService;}[HttpGet]public string GetNameById(int id){return this._studentService.GetName(id);}}
}

试运行 

运行程序,并导航到Student/GetNameById,如下图所示:

                

                  

                      

 

 

 

 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/548516.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初探EntityFramework——来自数据库的EF设计器

本文通过简单的示例&#xff0c;先初步了解下EF四种设计模式之一&#xff1a;来自数据库的EF设计器。 来自数据库的EF设计器&#xff0c;顾名思义&#xff0c;需要有新建的数据库和表结构&#xff0c;才能生成EF设计器&#xff0c; 在本地新建数据库KTStore&#xff0c;并且新建…

初探EntityFramework——空EF设计器模型

如果没有任何现存数据库架构&#xff0c;可以使用空的EF设计器模型。本文将通过简单示例&#xff0c;了解如何使用空EF设计器模型。 新建空的控制器应用程序EFDesignerDemo&#xff0c;如下图所示&#xff1a; 在项目中右键&#xff0c;选择“添加”&#xff0c;然后是“新建项…

初探EntityFramework——来自数据库的Code First

Entity Framkwork从第二版&#xff08;EF4&#xff09;开始&#xff0c;支持新的CodeFirst模式&#xff08;程序代码优先&#xff09;&#xff0c;以自定义类定义数据模型。简化了EF的开发过程。本文章使用简单的示例来说明如何使用来自数据库的CodeFirst模式。 新建一个空的控…

初探EntityFramework——空Code First模型

如果不是从现有的系统升级&#xff0c;想要创建全新的项目可以从“空Code First模型开始”。“空CodeFirst模型”要先创建类&#xff0c;Visual Studio会从项目第一次执行的时候根据连接自动创建需要的数据库结构。本文将简单示例说明如何使用“空CodeFirst模型”。 新建控制台…

初探EntityFramework——实体类结构映射

实体类与数据表的映射有一套专用的规则。Code First 采用的惯例优于预先设置的设计&#xff0c;在没有任何设置的情况下&#xff0c;自动检测模型结构并推导出默认设置以简化类的设计&#xff0c;因此不需要特别设置类的属性即可完成模型设计。 例如&#xff0c;当DbContext的模…

深入了解EntityFramework——数据注解属性

当惯例规则不符合设计需求时&#xff0c;我们可以使用数据注解配置打造更合适的数据库模型。本文根据示例项目对常用的数据注解属性做一个简要的举例说明。 EFCodeFirst使用的约定大于配置的的编程模式&#xff0c; 这种模式利用默认约定根据我们的领域模型建立概念模型。然我们…

Android上实现柱状图表

Android上实现柱状图算法实现 第一步&#xff1a; 获取Android设备的屏幕大小 第二步&#xff1a; 在View对象中使用Canvas绘制蓝色边框与白色背景XY轴两条线&#xff0c;代码如下 第三步&#xff1a; 绘制柱状图标题 第四步&#xff1a; 根据数据集计算出每个系列数据所占X轴的…

深入了解EntityFramework——Fluent API

Fluent API 除了惯例原则与属性数据注解外&#xff0c;FluentAPI是另一种支持实体类配置设置的方式。与属性数据注解相比&#xff0c;它提供了更广泛的功能与设置弹性。实体类若同时设置了数据注解&#xff0c;则采用的优先权是“Fluent API” > "数据注解" &g…

深入了解EntityFramework——Lazy Loading与Eager Loading

Lazy Loading&#xff1a;延迟加载。Eager Loading&#xff1a;贪婪加载。 首先通过一个简单的控制台应用程序例子说明延迟加载&#xff1a; 订单主表和订单从表&#xff0c;并且订单主表和订单从表是一对多的关系&#xff0c;代码如下图所示&#xff1a; //订单主表public cl…

SQL – 2.SQLServer的管理 + 3.SQL基础1 + 4.SQL基础2

SQLServer的管理 常用字段类型&#xff1a;bit(可选值0、1)、datetime、int、varchar、nvarchar&#xff08;可能含有中文用nvarchar&#xff09;varchar、nvarchar 和char(n)的区别&#xff1a; char(n)不足长度n的部分用空格填充。Var&#xff1a;Variable&#xff0c;可变的…

EntityFramework进阶——继承

通过类型继承&#xff0c;我们可以更弹性地处理数据&#xff0c;有3中相关的技巧&#xff0c;即TPH&#xff0c;TPT&#xff0c;TPC。 Table Per Hierarchy&#xff08;TPH&#xff09; 当单个数据表存储不同数据类型时&#xff0c;在数据模型的设计上&#xff0c;可以使用Tab…

EntityFramework进阶——数据编辑与维护

实体数据对象状态 在EF环境下&#xff0c;应用程序更改数据对象会引发数据集状态的变更&#xff0c;可能的状态有以下几种&#xff1a; 数据对象状态列表Added添加实体对象创建到实体集中&#xff0c;数据未添加进数据库Modified实体对象已经存在于实体数据集中&#xff0c;数…

第六章扩展——VMA

由 user process角度来说明的话&#xff0c;VMA 是 user process 里一段 virtual address space 区域&#xff1b;virtual address space 是连续的内存空间&#xff0c;当然VMA 也会是连续的空间。VMA 对 Linux 的主要好处是&#xff0c;可以内存的使用更有效率&#xff0c;並且…

EntityFramework进阶——数据变更冲突

TimeStamp 更新操作可能伴随数据冲突&#xff0c;我们可以通过并发处理妥善解决这一方面的问题。避免数据冲突比较方便的做法是自动加入字节数组&#xff08;byte[]&#xff09;类型的TimeStamp属性&#xff0c;对应到数据表中的rowvewsion类型字段&#xff0c;自动监控数据的…

MyBatis 数据持久层

引用&#xff1a;http://baike.baidu.com/view/4372646.htm MyBatis 的前身就是 iBatis 。是一个数据持久层(ORM)框架。 MyBatis框架 [1]iBATIS一词来源于“internet”和“abatis”的组合&#xff0c;是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Ac…

TP类库解析和使用系列[Input类]

2019独角兽企业重金招聘Python工程师标准>>> [ 概述 ] Input类是新版新增的一个输入数据管理类&#xff0c;提供了一些输入数据的管理和过滤。 [ 方法 ] getInstance 实例化Input类 filter 设置数据过滤方法 以下方法都是动态方法&#xff1a; get 获取get数据 post…

详解CSMA/CD

学网络的人&#xff0c;恐怕都得知道在总线网络中必须要用到CSMA/CD来传输数据。 CSMA/CD——带冲突检测的载波侦听多路访问机制&#xff0c;用来决定某一时刻介质访问权限问题&#xff0c;原理如下&#xff1a;所有站点共享一条传输线路&#xff08;总线&#xff09;&…

php读取checkbox数组值

2019独角兽企业重金招聘Python工程师标准>>> 用在批量删除或者更新等操作方面 <form method"post" action"CheckAction.php"> <input type"checkbox" value"h" name"flags[]">头条[h] <input ty…

EntityFramework进阶——Entity Splitting和Table Splitting

Entity Splitting——把单个实体拆分成多个表。Table Splitting——把单个表拆分成多个实体 Entity Splitting 下面通过例子来说明&#xff1a; 假设存在如下实体类&#xff1a; public class Employee{public int EmployeeId { get; set; }public string Name { get; set; …

EntityFramework进阶——CodeFirst数据库迁移

与视觉操作界面相比&#xff0c;CodeFirst机制提供了一套命令行模式的迁移工具&#xff0c;协助开发人员有效的进行数据库与数据模型的同步维护操作。 新建一个控制台项目CFMigrationsDemo&#xff0c;选用来自数据库的EF设计器模式&#xff0c; 并向其中添加一个Product.cs类文…