在上一章节,我们已经知道了再控制器中如何注入以及使用了。这一章,我们重点讲解下,如何在服务层中使用。

我们新定义一个教师类,在服务层中,通过这个教师类服务层,获取学生的年龄。实现在教师类的服务层中调用了学生类的服务接口对象。

新建一个教师类接口:ITeacherService.cs

namespace AutoFacTest.Service
{
public interface ITeacherService
{
int GetStudentAge(string name); }
}

接着定义一个 教师实现类,TeacherService.cs

   public class TeacherService:ITeacherService
{
/// <summary>
/// 定义学生接口服务类
/// </summary>
private readonly IStudentService _stu; /// <summary>
/// 实现构造函数注入
/// </summary>
/// <param name="stu"></param>
public TeacherService(IStudentService stu)
{
_stu = stu;
} /// <summary>
/// 调用学生类,获取学生信息
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public int GetStudentAge(string name)
{
return _stu.GetStudentAge(name);
} }

从上面的代码,我们可以看到我们在TeacherService的构造函数中已经实现了学生抽象类的注入。通过下一步在全局注入即可完成实例化。

下一步,在global中,新增教师类的注入

 private void AutoFacRegister()
{
var builder = new ContainerBuilder();
//注册MVC控制器(注册所有到控制器,控制器注入,就是需要在控制器的构造函数中接收对象)
// builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterControllers(typeof (MvcApplication).Assembly).PropertiesAutowired();
/*接口实现*/
builder.RegisterType<StudentService>().As<IStudentService>();
builder.RegisterType<TeacherService>().As<ITeacherService>();
//设置依赖解析器
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}

以上,我们就做好准备了。

下一步,界面显示

 public class HomeController : Controller
{
public IStudentService Stu { get; set; } //定义全局的学生抽象类对象
public ITeacherService Teac { get; set; }
/// <summary>
/// 通过构造函数进行注入,注意,参数是抽象类,非实现类。因为已经在global中将实现类映射给了抽象类
/// </summary>
// GET: Home
public void Index()
{
Response.Write("学生类:"+ Stu.GetStudentAge("张三")+"<br />");
Response.Write("教师类:"+Teac.GetStudentAge("张三")+"<br />");
}
}

然后浏览网页看结果:

已经实现了在服务层中的调用学生抽象类。这说明了一个点,autofac的注入是全局。

大家可能会发现在我们的global文件中,所有服务层的类都需要一个个注册,那如果很多类的话,那可写老长了。

autofac还提供的其他类型注入,下面就介绍我们的解决办法。

定义一个公共空接口 IDependency,所有实现类都集成这个接口。

namespace AutoFacTest.Service
{
/// <summary>
/// 空接口对象,用于一次性注入
/// </summary>
public interface IDependency
{
}
}

然后 学生类,和教师类都继承

  public class TeacherService:ITeacherService, IDependency
   public class StudentService:IStudentService, IDependency

在global中,换个方式进行注入

  private void AutoFacRegister()
{
var builder = new ContainerBuilder();
//注册MVC控制器(注册所有到控制器,控制器注入,就是需要在控制器的构造函数中接收对象)
// builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterControllers(typeof (MvcApplication).Assembly).PropertiesAutowired();
/*接口实现*/
// builder.RegisterType<StudentService>().As<IStudentService>();
// builder.RegisterType<TeacherService>().As<ITeacherService>(); //注册所有实现了 IDependency 接口的类型
Type baseType = typeof(IDependency);
Assembly[] assemblies = Directory.GetFiles(AppDomain.CurrentDomain.RelativeSearchPath, "*.dll").Select(Assembly.LoadFrom).ToArray();
builder.RegisterAssemblyTypes(assemblies)
.Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract)
.AsSelf().AsImplementedInterfaces()
.PropertiesAutowired().InstancePerLifetimeScope();
//设置依赖解析器
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

ASP.NET MVC IOC 之 Autofac(二)的更多相关文章

  1. ASP.NET MVC IOC 之AutoFac

    ASP.NET MVC IOC 之AutoFac攻略 一.为什么使用AutoFac? 之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用AutoFac的貌似更为普遍,于是捯饬了两天, ...

  2. [转]ASP.NET MVC IOC 之AutoFac攻略

    本文转自:http://www.cnblogs.com/WeiGe/p/3871451.html 一.为什么使用AutoFac? 之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用A ...

  3. ASP.NET MVC IOC 之AutoFac攻略

    一.为什么使用AutoFac? 之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用AutoFac的貌似更为普遍,于是捯饬了两天,发现这个东东确实是个高大上的IOC容器~ Autofa ...

  4. ASP.NET MVC IOC 之 Autofac 系列开篇

    本系列主要讲述Autofac在.NET MVC项目以及webform中的使用. autofac为IOC组件,实现控制反转,主要结合面向接口编程,完成较大程度的解耦工作. 作为初学者,将学习到的每一步, ...

  5. ASP.NET MVC IOC 之 Autofac(一)

    新建一个MVC项目,如 AutoFacTest,引用autofac,如下图: 接下来就是开始进行编程了 首先,新建一个类库,名为 AutoFacTest.Service,该类库编写服务层代码,我们的接 ...

  6. ASP.NET MVC IOC 之 Autofac(三)-webform中应用

    在webform中应用autofac,只有global中的写法不一样,其他使用方式都一样 nuget上引用: global中的写法: private void AutoFacRegister() { ...

  7. ASP.NET MVC IOC依赖注入之Autofac系列(二)- WebForm当中应用

    上一章主要介绍了Autofac在MVC当中的具体应用,本章将继续简单的介绍下Autofac在普通的WebForm当中的使用. PS:目前本人还不知道WebForm页面的构造函数要如何注入,以下在Web ...

  8. Ioc容器Autofac系列(2)-- asp.net mvc中整合autofac

    经过上篇蜻蜓点水的介绍后,本篇通过实例快速上手autofac,展示当asp.net mvc引入了autofac之后会带来什么. 创建Asp.net MVC并引入Autofac 首先,创建一个MVC站点 ...

  9. ASP.NET MVC IOC 之Ninject攻略

    ASP.NET MVC IOC 之Ninject攻略 一.为什么要使用Ninject? 很多其它类型的IOC容器过于依赖配置文件,老是配置,总感觉有点不爽,而且要使用assembly-qualifie ...

随机推荐

  1. 分布式系统全局唯一ID的生成

    分布式系统全局唯一ID的生成 一 .什么是分布式系统唯一ID ​ 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识. ​ 如在金融.电商.支付.等产品的系统中,数据日渐增长,对数据分库分表后 ...

  2. 【OI备忘录】dalao博文收藏夹

    [dalao学习笔记总览] [数学] 数论分块:数论分块 矩阵树定理Matrix_Tree:矩阵树Matrix-Tree定理与行列式 杨氏矩阵:杨氏矩阵和钩子公式 Hall定理:Hall定理学习小记 ...

  3. E04 【买衣服】Do you have this T-shirt in red?

    核心句型 Do you have this T-shirt in red? 这样的T恤衫,你们有红色的吗? 场景对话: A:Excuse me,do you have this T-shirt in ...

  4. 吴丽丽-201871010123 《面向对象程序设计(java)》第六、七周学习总结

    吴丽丽-201871010123 <面向对象程序设计(java)>第六.七周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh ...

  5. MySQL数据库 外键,级联, 修改表的操作

    1.外键: 用来建立两张表之间的关系 - 一对多 - 多对多 - 一对一 研究表与表之间的关系: 1.定义一张 员工部门表 id, name, gender, dep_name, dep_desc - ...

  6. Hive学习之修改表、分区、列

    Hive学习之修改表.分区.列 https://blog.csdn.net/skywalker_only/article/details/30224309 https://www.cnblogs.co ...

  7. O2O场景下的推荐排序模型:

    推荐系统遇上深度学习(五)--Deep&Cross Network模型理论和实践 发表: 2018-04-22 推荐系统遇上深度学习系列:推荐系统遇上深度学习(一)--FM模型理论和实践:ht ...

  8. JDOJ 1770 埃及分数

    JDOJ 1770: 埃及分数 https://neooj.com/oldoj/problem.php?id=1770 Description 分子均为1的分数叫做埃及分数,因为古代埃及人在进行分数运 ...

  9. python的设计模式之MVC模式

    模型-视图-控制器模式 关注点分离(Separation of Concerns,SoC)原则是软件工程相关的设计原则之一.SoC原则背后的思想是将一个应用切分成不同的部分,每个部分解决一个单独的关注 ...

  10. odoo fields_view_get

    odoo fields_view_get创建动态视图方法 odoo  fields_view_get方法是一个比较有用比较灵活的广泛,如果使用得当,可以做到一些常规方法无法实现的功能,本文列举若干种用 ...