.Net Core自身提供了一套简单的DI框架,能满足我们DI基本的需求。它依赖以下组件,需要从Nuget包下拉取。

    Microsoft.Extensions.DependencyInjection.Abstractions

  其中有2个比较重要的对象,ServiceCollection和ServiceProvider。前者是DI容器,代表这个各个服务实例的集合,提供了一些基本注入方式,如下示例

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
 
       //任意一个ServiceProvider下取得的实例都相同 
            services.AddSingleton<IBookDAL, MemoryBookDAL>();
       //每一次从ServiceProvider取得,均返回一个新的实例 
            services.AddTransient<IBookDAL2, MemoryBookDAL2>();
       //在同一作用域下生成的实例相同,即同一个ServiceProvider下取得的实例相同 
            services.AddScoped<IBookDAL3, MemoryBookDAL3>();
            
       //获取Service
       var s= services.BuildServiceProvider().GetService<IBookDAL>();  
        }

  后者负责Service实例的维护,包括创建和销毁。这个对象也提供了集成第三方组件的扩展点。可以由IServiceCollection接口的扩展方法BuildServiceProvider得到它。

  这就是.Net Core自身的DI框架的一些基本情况,使用很简单。在日常开发过程中,我们可能会用到一些专业性更高的DI组件,我们这里使用Autofac来尝试集成看看。

  首先Nuget包,别拉错了。

Autofac.Extensions.DependencyInjection

  集成方式如下,ConfigureServices方法需要返回 IServiceProvider。特别关注下 builder.Populate(services); 注释说明

        public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            services.AddMvc(cfg =>
            {
                var filter = ApplicationContainer.Resolve<DefaultExceptionFilterAttribute>();
                //var filter = services.BuildServiceProvider().GetService<DefaultExceptionFilterAttribute>();
                if (filter != null)
                    cfg.Filters.Add(filter);
            }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

            var serviceProvider = AutoFacRegister(services);

            return serviceProvider;

        }

     public IContainer ApplicationContainer { get; private set; }

        public IServiceProvider AutoFacRegister(IServiceCollection services)
        {
            var builder = new ContainerBuilder();

            //very import
            //正常返回IServiceProvider 并不能替代原IServicePrivder。还需要自定义ServiceScopeFactory保证RequestServices返回的也是你自定义的ServiceProvider。
            //详细见https://www.cnblogs.com/artech/p/3rd-party-di-integration.html
            //此处autofac做了特殊处理
            builder.Populate(services);

            builder.RegisterType<MemoryBookDAL>().As<IBookDAL>().SingleInstance();
            builder.RegisterType<TestPermissionCheckService>().As<IPermissionCheckService>().SingleInstance();
            builder.RegisterType<PermissionCheckAuthorizationHandler>().As<IAuthorizationHandler>();
            builder.RegisterType<DefaultExceptionFilterAttribute>();

            builder.RegisterType<GlobalApiLoggingMiddleware>();
            builder.RegisterType<GlobalExceptionMiddleware>();

            ApplicationContainer = builder.Build();

            return new AutofacServiceProvider(ApplicationContainer);
        }

.Net Core 依赖注入手记的更多相关文章

  1. # ASP.NET Core依赖注入解读&使用Autofac替代实现

    标签: 依赖注入 Autofac ASPNETCore ASP.NET Core依赖注入解读&使用Autofac替代实现 1. 前言 2. ASP.NET Core 中的DI方式 3. Aut ...

  2. net core 依赖注入问题

    net core 依赖注入问题 最近.net core可以跨平台了,这是一个伟大的事情,为了可以赶上两年以后的跨平台部署大潮,我也加入到了学习之列.今天研究的是依赖注入,但是我发现一个问题,困扰我很久 ...

  3. NET Core依赖注入解读&使用Autofac替代实现

    NET Core依赖注入解读&使用Autofac替代实现 标签: 依赖注入 Autofac ASPNETCore ASP.NET Core依赖注入解读&使用Autofac替代实现 1. ...

  4. 实现BUG自动检测 - ASP.NET Core依赖注入

    我个人比较懒,能自动做的事绝不手动做,最近在用ASP.NET Core写一个项目,过程中会积累一些方便的工具类或框架,分享出来欢迎大家点评. 如果以后有时间的话,我打算写一个系列的[实现BUG自动检测 ...

  5. [译]ASP.NET Core依赖注入深入讨论

    原文链接:ASP.NET Core Dependency Injection Deep Dive - Joonas W's blog 这篇文章我们来深入探讨ASP.NET Core.MVC Core中 ...

  6. asp.net core 依赖注入几种常见情况

    先读一篇注入入门 全面理解 ASP.NET Core 依赖注入, 学习一下基本使用 然后学习一招, 不使用接口规范, 直接写功能类, 一般情况下可以用来做单例. 参考https://www.cnblo ...

  7. ASP.NET Core依赖注入——依赖注入最佳实践

    在这篇文章中,我们将深入研究.NET Core和ASP.NET Core MVC中的依赖注入,将介绍几乎所有可能的选项,依赖注入是ASP.Net Core的核心,我将分享在ASP.Net Core应用 ...

  8. 自动化CodeReview - ASP.NET Core依赖注入

    自动化CodeReview系列目录 自动化CodeReview - ASP.NET Core依赖注入 自动化CodeReview - ASP.NET Core请求参数验证 我个人比较懒,能自动做的事绝 ...

  9. ASP.NET Core 依赖注入最佳实践——提示与技巧

    在这篇文章,我将分享一些在ASP.NET Core程序中使用依赖注入的个人经验和建议.这些原则背后的动机如下: 高效地设计服务和它们的依赖. 预防多线程问题. 预防内存泄漏. 预防潜在的BUG. 这篇 ...

随机推荐

  1. spring创建bean异常

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappi ...

  2. 《C Prime Plus》第九节笔记

    第九节 函数 9.1 复习函数 函数原型 function prototype 函数调用 function call 函数定义 function definition 形参 实参 典型的ANSI C函 ...

  3. [LC] 293. Flip Game

    You are playing the following Flip Game with your friend: Given a string that contains only these tw ...

  4. Leetcode7_整数反转

    题目 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123输出: 321 示例 2: 输入: -123输出: -321 示例 3: 输入: 120输出: ...

  5. MySQL5.7.x安装教程(tar.gz)

    博主本人平和谦逊,热爱学习,读者阅读过程中发现错误的地方,请帮忙指出,感激不尽 二.MySQL安装(tar.gz)  1.系统环境设置 1.1清空系统mysql 安装mysql之前需要将系统自带的my ...

  6. 用Microsoft Chart Controls(MSChart)实现曲线图,并支持拖动放大到秒

    Microsoft Chart Controls(简称MSChart)控件,给图形统计和报表图形显示提供了很好的解决办法,同时支持Web和WinForm两种方式. MSChart 在.NET 4.0自 ...

  7. 常用的SQL优化

    转自:https://www.cnblogs.com/Cheney222/articles/5876382.html 一.优化 SQL 语句的一般步骤 1 通过 show status 命令了解各种 ...

  8. 解决Navicat无法连接到MySQL的问题

    解决Navicat无法连接到MySQL的问题 问题一:本地IP(xxx.xxx.xxx.xxx)没有访问远程数据库的权限.于是下面开启本地IP(xxx.xxx.xxx.xxx)对远程mysql数据库的 ...

  9. whatsoever|

    ADV (用于名词词组后,强调否定陈述)丝毫,任何,无论什么You use whatsoever after a noun group in order to emphasize a negative ...

  10. keepalive笔记之一:基本安装

    在安装文件中有范例说明 /usr/share/doc/keepalived-1.2.13/samples/ Keepalived:它的诞生最初是为ipvs(一些服务,内核中的一些规则)提供高可用性的, ...