.net core2.1 三层中使用Autofac代替原来Ioc

首先,现有的三层项目的结构

其中  Repository

 public interface IPersonRepository
    {
         string Eat();
    }
public class PersonRepository : IPersonRepository
    {
        public string Eat()
        {
            return "吃饭";
        }
    }

Service

public interface IPersonService
    {
        string Eat();
    }
 public class PersonService : IPersonService
    {
       private  IPersonRepository _personRespository;
        //通过构造函数注入 repository
        public  PersonService(IPersonRepository personRespository)
        {
          _personRespository = personRespository;
        }
        public string Eat()
        {
            return  _personRespository.Eat();
        }
    }

一、安装Autofac

nuget上安装Autofac

二、替换内置的DI框架

    将Startup.cs中的ConfigureServices返回类型改为IServiceProvider,然后新起一个方法RegisterAutofac把创建容器的代码放到其中,然后建一个AutofacConfig 类来存放具体的注入代码,避免

  Startup.cs文件代码过多混乱。

 public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
            return RegisterAutofac(services);//注册Autofac
        }
        private IServiceProvider RegisterAutofac(IServiceCollection services)
        {
            //实例化Autofac容器
            var builder = new ContainerBuilder();
            builder.Populate(services);
            //Autofac注册对象
             AutofacConfig.RegisterObj(builder);
            var Container = builder.Build();
            //第三方IOC接管 core内置DI容器
            return new AutofacServiceProvider(Container);
        }
 public class AutofacConfig
    {
        public static void RegisterObj(ContainerBuilder builder)
        {
            //注册Service中的组件,Service中的类要以Service结尾,否则注册失败
            builder.RegisterAssemblyTypes(GetAssemblyByName("WXL.Service")).Where(a => a.Name.EndsWith("Service")).AsImplementedInterfaces();
            //注册Repository中的组件,Repository中的类要以Repository结尾,否则注册失败
            builder.RegisterAssemblyTypes(GetAssemblyByName("WXL.Repository")).Where(a => a.Name.EndsWith("Repository")).AsImplementedInterfaces();
        }
        /// <summary>
        /// 根据程序集名称获取程序集
        /// </summary>
        /// <param name="AssemblyName">程序集名称</param>
        /// <returns></returns>
        public static Assembly GetAssemblyByName(String AssemblyName)
        {
            return Assembly.Load(AssemblyName);
        }
    }

此时Autofac基本使用已经配好了。

三、测试效果

修改HomeController 实现注入Service

 public class HomeController : Controller
    {
        private IPersonService _personService;

        //通过构造函数注入Service
        public HomeController(IPersonService personService)
        {
            _personService = personService;
        }
        public IActionResult Index()
        {
            ViewBag.eat = _personService.Eat();
            return View();
        }
}

页面结果:

四、一个接口多个实现的情况

   比喻我现在在Service 中建三个类,IPayService, WxPayService,AliPayService,其中WxPayService,AliPayService都实现接口IPayService。

 public interface IPayService
    {
        string Pay();
    }
public class AliPayService : IPayService
    {
        public string Pay()
        {
            return "支付宝支付";
        }
    }
 public class WxPayService : IPayService
    {
        public string Pay()
        {
            return "微信支付";
        }
    }

先试一下结果,修改HomeController

 public class HomeController : Controller
    {
        private IPersonService _personService;
        private IPayService _payService;

        //通过构造函数注入Service
        public HomeController(IPersonService personService,IPayService payService)
        {
            _personService = personService;
            _payService = payService;
        }
        public IActionResult Index()
        {
            ViewBag.eat = _personService.Eat();
            ViewBag.pay = _payService.Pay();
            return View();
        }
    }

View

@{
    ViewData["Title"] = "Home Page";
}
@ViewBag.eat <br />
@ViewBag.pay

输出页面:

最后得到的是微信支付,因为两个对象实现一个接口的时候,注册时后面注册的会覆盖前面注册的。如果我想得到支付宝支付要怎么做呢?

 我们可以用另外一种注册方式RegisterType,修改注册方式AutofacConfig.cs。

public static void RegisterObj(ContainerBuilder builder)
        {
            //注册Service中的组件,Service中的类要以Service结尾,否则注册失败
            builder.RegisterAssemblyTypes(GetAssemblyByName("WXL.Service")).Where(a => a.Name.EndsWith("Service")).AsImplementedInterfaces();
            //注册Repository中的组件,Repository中的类要以Repository结尾,否则注册失败
            builder.RegisterAssemblyTypes(GetAssemblyByName("WXL.Repository")).Where(a => a.Name.EndsWith("Repository")).AsImplementedInterfaces();
            //单独注册
            builder.RegisterType<WxPayService>().Named<IPayService>(typeof(WxPayService).Name);
            builder.RegisterType<AliPayService>().Named<IPayService>(typeof(AliPayService).Name);
        }
        /// <summary>
        /// 根据程序集名称获取程序集
        /// </summary>
        /// <param name="AssemblyName">程序集名称</param>
        /// <returns></returns>
        public static Assembly GetAssemblyByName(String AssemblyName)
        {
            return Assembly.Load(AssemblyName);
        }

用Named区分两个组件的不同,后面的typeof(WxPayService).Name 是任意字符串,这里直接用这个类名作标识,方便取出来时也是用这个名字,不易忘记。

然后就是取出对应的组件了,取的时候用Autofac的 上下文(IComponentContext) ,修改HomeController

 public class HomeController : Controller
    {
        private IPersonService _personService;
        private IPayService _wxPayService;
        private IPayService _aliPayService;
        private IComponentContext _componentContext;//Autofac上下文
        //通过构造函数注入Service
        public HomeController(IPersonService personService, IComponentContext componentContext)
        {
            _personService = personService;
            _componentContext = componentContext;
            //解释组件
            _wxPayService = componentContext.ResolveNamed<IPayService>(typeof(WxPayService).Name);
            _aliPayService =componentContext.ResolveNamed<IPayService>(typeof(AliPayService).Name);
        }
        public IActionResult Index()
        {
            ViewBag.eat = _personService.Eat();
            ViewBag.wxPay = _wxPayService.Pay();
            ViewBag.aliPay = _aliPayService.Pay();
            return View();
        }
    }

Index View:

@{
    ViewData["Title"] = "Home Page";
}
@ViewBag.eat <br />
@ViewBag.wxPay <br />
@ViewBag.aliPay

结果:

完成。

    

原文地址:https://www.cnblogs.com/wei325/p/9191686.html

时间: 2024-08-30 17:44:21

.net core2.1 三层中使用Autofac代替原来Ioc的相关文章

Asp.net mvc中整合autofac

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

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 Web Forms/MVC/Console App中使用Autofac

本来简单介绍了Autofac在Asp.Net Web Forms中的应用,后来又添加了mvc.控制台应用程序中使用Autofac,详情请看源码. ASP.NET Web Forms使用Autofac,至少需要一下步骤: 1,引用Autofac程序集. 2,添加Autofac Web Modules 到 Web.config. 3,在Global.asax中实现IContainerProviderAccessor接口. 我们创建一个ASP.NET Web Forms项目,命名为WebFormStu

浅谈三层中Model的作用

以前总是对三层中的Model概念不是很理解,今天早上查了一下,豁然开朗...... 怎么说呢,应该是面向对象编程吧.当我们在表单提交的时候,表单中的数据基本上是和数据库表中的字段相对应, 有时候,在提交表单的时候会有很多的参数传过来,当然你也可以一个一个根据name获取值,但是这样很麻烦,那么model 就产生了,其实model它就是一个类型,这个类型可以包含许多的int.string等等的类型,你可以通过代码生成器根据数据库 中的表生成Model,也可以手写,你在后台表单获取的时候,直接在方法

Autofac和nopcommerce中的Autofac, 还有反射

随笔分类 - Ioc Ioc容器Autofac系列(3)-- 三种注册组件的方式 摘要: 简单来说,所谓注册组件,就是注册类并映射为接口,然后根据接口获取对应类,Autofac将被注册的类称为组件. 虽然可像上篇提到的一次性注册程序集中所有类,但AutoFac使用最多的还是单个注册.这种注册共有三种方式,其中最简单的就是用As方法,例如,ArrayList继承了IEnumerable接口,若将其注册到Autofac中,写法如下所示: ContainerBuilder b...阅读全文 poste

三层中的大学问

最近也进展到了三层的学习,看了一些三层的相关的资料, 才逐渐的认识到三层的概念. 当初没看之前,在学习软件工程的时候,就曾设想过一个项目 的流程也应该大致的包括三部分:需求分析.业务逻辑处理.数 据库.而当面对三层的时候,才恍然大悟,这不就是三层的影子 吗?三层到底是何方神圣呢,下面先看一副图片. 大家设想一下,我们平常去饭店吃饭的场景,前脚刚进去, 服务员就笑嘻嘻的来迎接你,把你点的菜肴,交给头大的伙夫, 伙夫通过后勤人员提前准备好的菜,来做出美味的佳肴,最后再 次通过服务员反馈给你. 想一下

ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)

前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器) ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入) ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截) 正文 上

在后台业务管理系统中使用Autofac实现微信接口的处理

在后台业务管理系统中使用Autofac实现微信接口的处理,我们只需要把相关使用到的DLL放到BIN目录里面即可,通过IOC控制反转方式实现对接口的调用.在实现在业务系统里面,我们本身程序可能已经依赖了很多相关的DLL类库,这种可以降低对相关DLL的强依赖,而以一种松耦合的方式使用我们所需要的微信接口. 在之前随笔<C#开发微信门户及应用(42)--使用Autofac实现微信接口处理的控制反转处理>里面介绍了Autofac组件实现IOC控制反转的一些实现细节,本篇随笔介绍在业务管理系统中,我们需

ASP.NET Core Web 应用程序系列(二)- 在ASP.NET Core中使用Autofac替换自带DI进行批量依赖注入(MVC当中应用)

原文:ASP.NET Core Web 应用程序系列(二)- 在ASP.NET Core中使用Autofac替换自带DI进行批量依赖注入(MVC当中应用) 在上一章中主要和大家分享在MVC当中如何使用ASP.NET Core内置的DI进行批量依赖注入,本章将继续和大家分享在ASP.NET Core中如何使用Autofac替换自带DI进行批量依赖注入. PS:本章将主要采用构造函数注入的方式,下一章将继续分享如何使之能够同时支持属性注入的方式. 约定: 1.仓储层接口都以“I”开头,以“Repos