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;并且新建…

【034】◀▶ 学习网站 问题解决

--------------------------------------------------------------------------------------------------------- ●● 目录&#xff1a; A1 ………… ArcGIS Engine 学习网站A2 ………… 其他 ArcGIS Engine 开发网站A3 ………… 程序开发技术博客A4 ………… 问题解决链接 —…

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

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

Qt4小技巧——QTextEdit自动滚屏

CuteQt Blog Blog Archive Qt4小技巧——QTextEdit自动滚屏Qt4小技巧——QTextEdit自动滚屏本站所有文章由本站和原作者保留一切权力&#xff0c;仅在保留本版权信息、原文链接、原文作者的情况下允许转载&#xff0c;转载请勿删改原文内容&#xff0c; 并不得用于商业用途。…

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

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

CentOS上安装mysql5.5.23

mysql 5.5版本需要 cmake进行编译安装安装cmake工具需安装基础编译环境 下载安装软件包&#xff1a;mysql-5.5.23.tar.gzhttp://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.23.tar.gz/from/http://mysql.he.net/cmake-2.8.*.tar.gzhttp://www.cmake.org/files/v2.8/cmak…

初探EntityFramework——空Code First模型

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

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

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

昨天安装复习中遇到的问题小结

1、SQL实例无法找到。 解决方法&#xff1a;在SQL服务器上&#xff0c;手工添加例外TCP 1433端口&#xff0c;因为初期搜索的资料上&#xff0c;说添加UDP的1433&#xff0c;当时还犹豫了下&#xff0c;想到是不是TCP&#xff0c;结果想着肯定资料不会错的&#xff0c;结果浪费…

深入了解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…

为什么编程语言以及数据库要从1970年1月1日开始计算时

最初计算机操作系统是32位&#xff0c;而时间也是用32位表示。System.out.println(Integer.MAX_VALUE);2147483647Integer在JAVA内用32位表示&#xff0c;因此32位能表示的最大值是2147483647。另外1年365天的总秒数是31536000&#xff0c;2147483647/31536000 68.1也就是说32…

深入了解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…

几种Lucene.Net打开IndexReader的方式

入门第一式&#xff1a; IndexReader.Open(Dir,readOnly); 当readOnly为true的时候效率最高&#xff0c;最好不要用Reader删除修改记录&#xff1b; 入门第二式&#xff1a; reader.Reopen(readOnly); 优点&#xff1a;比第一式效率高&#xff0c;推荐使用&#xff1b; 缺点&am…

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;自动监控数据的…