首页 技术 正文
技术 2022年11月19日
0 收藏 782 点赞 3,724 浏览 2413 个字

  .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);        }
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,104
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,581
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,428
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,200
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,835
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,918