ASP.NET MVC IOC 之 Autofac(二)

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

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

新建一个教师类接口: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));

原文地址:https://www.cnblogs.com/fei686868/p/10996959.html

时间: 2024-08-30 07:33:53

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

Asp.Net Mvc IOC之Autofac

正文: Autofac(表面意思为自动工厂),那么我理解为Autofac干的事情就是工厂做的事情,在框架的搭建中为了解耦以及便于日后维护等原因通常都使用接口技术,配合使用反射技术得到程序集实例(也是解耦)相当于返回实现了接口的子类,这就是工厂.这里总结使用autofac构造函数依赖注入的学习心得: 1.我一开始用Asp.Net进行了试验autofac(只是试一试): 从上面可以看到,在myService的构造函数内进行了注入,引用autofac.dll之后,接下来在应用程序一开始就执行的(也只是

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

上一章主要介绍了Autofac在MVC当中的具体应用,本章将继续简单的介绍下Autofac在普通的WebForm当中的使用. PS:目前本人还不知道WebForm页面的构造函数要如何注入,以下在WebForm页面将主要采用属性注入的方式. 接下来我们正式进入主题,在上一章的基础上我们再添加一个web项目TianYa.DotNetShare.WebDemo,首先看我们的解决方案 本demo的web项目为ASP.NET Web 应用程序(.NET Framework 4.5) 空Web窗体,需要引用

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

经过上篇蜻蜓点水的介绍后,本篇通过实例快速上手autofac,展示当asp.net mvc引入了autofac之后会带来什么. 创建Asp.net MVC并引入Autofac 首先,创建一个MVC站点,为方便起见,选初始带HomeController和AccountController的那种.然后通过NuGet或到Autofac官网下载来引入类库.个人推荐前者,因为从VS2010开始,已内集可视化的NuGet功能,使用起来非常方便.如下图所示: 这是vs2012的界面,点击"Manage NuG

ASP.NET MVC IOC 之Ninject攻略

一.为什么要使用Ninject? 很多其它类型的IOC容器过于依赖配置文件,老是配置,总感觉有点不爽,而且要使用assembly-qualified名称(也就是类型的全名)来进行定义,稍不注意就会因为打错字而令整个程序崩掉.Ninject是一个快如闪电.超轻量级的基于.Net平台的IOC容器,主要用来解决程序中模块的耦合问题,它的目的在于做到最少配置.因此如果你不喜欢配置,不喜欢重量级IOC框架,那么就用小苹果Ninject吧! 二.Ninject的使用 首先你必须获取Ninject,其官网下载

ASP.NET MVC IOC之Unity攻略

一.你知道IOC与DI吗? 1.IOC(Inversion of Control )——控制反转 即依赖对象不在被依赖模块的类中直接通过new来获取 先看看下面这段代码的问题~ public class SqlServerDal { public void Delete() { Console.WriteLine("删除表中某个订单信息!"); } } public class Order { private readonly SqlServerDal dal = new SqlSer

Asp.net mvc中整合autofac

创建Asp.net MVC并引入Autofac 首先,创建一个MVC站点,为方便起见,选初始带HomeController和AccountController的那种.然后通过NuGet或到Autofac官网下载来引入类库.个人推荐前者,因为从VS2010开始,已内集可视化的NuGet功能,使用起来非常方便.如下图所示: 这是vs2012的界面,点击“Manage NuGet Packages…”,弹出窗体如下,在右上角搜索框中输入“Autofac”,找到对应的库点击安装即可.这里需要应用的库有两

ASP.NET MVC +EasyUI 权限设计(二)环境搭建

请注明转载地址:http://www.cnblogs.com/arhat 今天突然发现博客园出问题了,老魏使用了PC,手机,平板都访问博客园了,都是不能正常的访问,原因是不能加载CSS,也就是不能访问common.cnblogs.com这个域名,一直出现"Aborted",非常的郁闷. 页面就是这样子的,不知道为什么,难道是不是我的3个终端有问题吧,还是园子的服务器有问题呢?还是路由器的问题呢?到现在这个问题还没解决,郁闷死了!弄得心情非常的不爽. 好吧,不在说这个问题了,开始我们的正

在asp.net mvc 中使用Autofac

据说.net 世界里,最强的依赖注入容器是Autofac .不管是谁,Nopcommerce2.8 用了它,所以就简单研究一下喽. 用vs 2012 创建一个Asp.net mvc3 的样例项目.然后使用NuGet(Vs2012 自带的有,版本低的话,似乎要安装插件),下载安装autofac的dll,如图1,2. 图1 NuGet 图2 ,load  autofac autofac 要加载两个dll哦,一个是autofac 的core ,另外一个是和asp.net mvc3集成的dll 然后,我

DevExpress v15.1:ASP.NET MVC功能升级(二)

<下载最新版DevExpress ASP.NET Controls v15.1.5> MVC HTML编辑器扩展 占位符(邮件合并) 占位符允许最终用户创建文本模板,这些占位符可以被替换为所需的值(从数据库). 标签检查器(文档结构路径导航)和所选的标签属性编辑器 新的标签检查器允许最终用户浏览一个标签层次结构.删除标签,并使用标签属性编辑器自定义标签属性. 内容元素过滤 DevExpress HTML编辑器现在允许您过滤内容元素,您可以指定标签.属性和样式属性的过滤规则. 其它: 插入的资源