06、NetCore2.0插件框架之整合Autofac_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 06、NetCore2.0插件框架之整合Autofac

06、NetCore2.0插件框架之整合Autofac

 2017/8/23 17:08:40  敦格  程序员俱乐部  我要评论(0)
  • 摘要:06、NetCore2.0插件框架之整合Autofac除了使用NetCore2.0系统DI(依赖注入)框架外,我们还可以使用其他成熟的DI框架,如Autofac、Unity等。只要他们支持IServiceProvider接口规范。我们这次尝试使用Autofac来替代系统DI框架。一、安装支持NetCore2.0的Autofac包使用VS2017创建一个空的MVC项目,准备在这个项目中整合Autofac1.安装核心包install-packageautofac2.安装扩展包install
  • 标签:net 插件

06、NetCore2.0插件框架之整合Autofac

除了使用NetCore2.0系统DI(依赖注入)框架外,我们还可以使用其他成熟的DI框架,如Autofac、Unity等。只要他们支持IServiceProvider接口规范。我们这次尝试使用Autofac来替代系统DI框架。

 

一、安装支持NetCore2.0的Autofac包

使用VS2017创建一个空的MVC项目,准备在这个项目中整合Autofac

1.安装核心包

install-package autofac

2.安装扩展包

install-package Autofac.Extensions.DependencyInjection

就是它支持了IServiceProvider接口规范:

using System;
using Microsoft.Extensions.DependencyInjection;

namespace Autofac.Extensions.DependencyInjection
{
    public class AutofacServiceProvider : IServiceProvider, ISupportRequiredService
    {        
        public AutofacServiceProvider(IComponentContext componentContext);
        public object GetRequiredService(Type serviceType);        
        public object GetService(Type serviceType);
    }
}

 

二、在Web应用中整合Autofac

系统DI框架入口是Startup.ConfigureServices方法:

        public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            services.AddSingleton<IRun, Run>();

            return services.BuildServiceProvider();
        }

 我们可以看出,这个方法配置了IServiceProvider的实现。那么,我们的整合方法就是用Autofac实现的IServiceProvider对象,替换系统的IServiceProvider。

        public IContainer ApplicationContainer { get; private set; }

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

            // 注入方式1:autofac将全盘接收            
            services.AddSingleton<IRun, Run>();

            // 注入方式2: autofac自行注册
            //builder.RegisterType<Run>().As<IRun>();

            builder.Populate(services);
            this.ApplicationContainer = builder.Build();

            return new AutofacServiceProvider(this.ApplicationContainer);
        }

 可以看出,既可以用原有的方式注册插件,也可以用Autofac方式注册插件,最后Autofac会全盘接收管理。其中自定义的接口如下:

   interface IRun
    {
        string Show();
    }

    public class Run : IRun
    {
        public string Show()
        {
            return "奔跑吧,兄弟";
        }

    }
logs_code_collapse">View Code

下面我们在业务中调用这个接口,看是否成功。

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.Run(async (context) =>
            {
                await context.Response.WriteAsync(app.ApplicationServices.GetService<IRun>().Show());
            });
        }   

运行效果是ok的^_^,不难体会到,接口的对扩展开放特点。

发表评论
用户名: 匿名