首页 > 其他分享 >Fireasy3 揭秘 -- 自动服务部署

Fireasy3 揭秘 -- 自动服务部署

时间:2023-03-02 23:24:00浏览次数:52  
标签:assembly -- 部署 services IServicesDeployer Fireasy3 揭秘

目录


  前篇已经介绍了依赖注入与服务发现,还有另外一种机制是服务部署,顾名思义就是可以在程序集中定义一个实现,在手动添加依赖注入,这一般是有选择性的注入。
  回顾 DefaultServiceDiscoverer 类,你会发现有这么一个 ConfigureServices 方法,前篇是没有介绍过的,专门提到本篇里来细说。如下:

    /// <summary>
    /// 发现工作目录中所有程序集中的依赖类型。
    /// </summary>
    /// <param name="services"></param>
    private void DiscoverServices(IServiceCollection services)
    {
        foreach (var assembly in GetAssemblies())
        {
            if (_options?.AssemblyFilters?.Any(s => s.IsFilter(assembly)) == true)
            {
                continue;
            }

            if (_options?.AssemblyFilterPredicates?.Any(s => s(assembly)) == true)
            {
                continue;
            }

            _assemblies.Add(assembly);

            ConfigureServices(services, assembly);
            DiscoverServices(services, assembly);
        }
    }

  在 ConfigureServices 方法里,通过 ServicesDeployAttribute 特性去查找程序集中定义的部署类。所谓部署类,实际上是往 services 里添加服务描述(服务与实现的关系映射)。如下:

    private void ConfigureServices(IServiceCollection services, Assembly assembly)
    {
        var attrs = assembly.GetCustomAttributes<ServicesDeployAttribute>();
        if (attrs.Any())
        {
            foreach (var attr in attrs.OrderBy(s => s.Priority))
            {
                if (Activator.CreateInstance(attr.Type) is IServicesDeployer deployer)
                {
                    deployer.Configure(services);
                }
            }
        }
        else
        {
            var types = assembly.GetTypes().Where(t => t.IsClass && !t.IsAbstract && typeof(IServicesDeployer).IsAssignableFrom(t)).ToList();

            var deployers = types
                .Select(s => Activator.CreateInstance(s))
                .Where(s => s is IServicesDeployer)
                .Cast<IServicesDeployer>()
                .ToList();

            deployers.ForEach(s => s!.Configure(services));
        }
    }

  它首先会通过 ServicesDeployAttribute 特性去找所指定的部署类,这样的好处在于直达终点,省去了遍列程序集中的所有类,逐个去判断有没有实现了 IServicesDeployer 接口。找到这些部署类后,实例化一个对象,调用 Configure 去配置容器。
  采用这种部署器后,你只需要在你的程序集里定义一个实现 IServicesDeployer 接口的类,想怎么 Add 就怎么 Add,灵活性要高。比如在 Fireasy.Data 项目中,就可以定义如下:

[assembly: ServicesDeploy(typeof(DataServicesDeployer))]

namespace Fireasy.Data.DependencyInjection
{
    /// <summary>
    /// 服务部署。
    /// </summary>
    public class DataServicesDeployer : IServicesDeployer
    {
        void IServicesDeployer.Configure(IServiceCollection services)
        {
            services.AddSingleton<IProviderManager, DefaultProviderManager>();
            services.AddSingleton<IDatabaseFactory, DefaultDatabaseFactory>();
            services.AddSingleton<IRowMapperFactory, DefaultRowMapperFactory>();
            services.AddScoped<IDatabase>(sp => sp.GetRequiredService<IDatabaseFactory>().CreateDatabase());
            services.AddScoped<DistributedController>();
        }
    }
}

  你可以不用关注它在什么时候被部署,因为只要在起先调用了 AddFireasy 方法后,它就被不知不觉调用了。
  同一个程序集里可以存在多个部署类,ServicesDeployAttribute 也是允许多次指定的,甚至可以使用 Priority 来指定被部署的优先级。

  最后,奉上 Fireasy 3 的开源地址:https://gitee.com/faib920/fireasy3 ,欢迎大家前来捧场。

  本文相关代码请参考 https://gitee.com/faib920/fireasy3/src/libraries/Fireasy.Common/DependencyInjection 下的相关文件。

  更多内容请移步官网 http://www.fireasy.cn 。

标签:assembly,--,部署,services,IServicesDeployer,Fireasy3,揭秘
From: https://www.cnblogs.com/fireasy/p/17173997.html

相关文章

  • Python 异步: 在 Asyncio 中运行阻塞任务(14)
    阻塞任务是阻止当前线程继续进行的任务。如果在asyncio程序中执行阻塞任务,它会停止整个事件循环,从而阻止任何其他协程继续进行。我们可以通过asyncio.to_thread()和......
  • 机器学习: 可视化反卷积操作
    转置卷积操作的详细分解1.简介转置卷积是用于生成图像的,尽管它们已经存在了一段时间,并且得到了很好的解释——我仍然很难理解它们究竟是如何完成工作的。我分享的文章描......
  • 命题逻辑 谓词逻辑
    昨天加今天学完了离散数学第五章加第六章,其中分别为命题逻辑和谓词逻辑。两者基本内容大致相同,都是由已知,通过逻辑推理,得到结论。只是,命题逻辑针对的对象是命题,谓词逻辑......
  • Python assert(断言)
    Pythonassert(断言)用于判断一个表达式,在表达式条件为false的时候触发异常。断言可以在条件不满足程序运行的情况下直接返回错误,而不必等待程序运行后出现崩溃的情况,例如......
  • temt
    @[TOC](文章目录)#前言本文主要记录下,在工作中一些常用的函数。#数组长度```c#defineARRAY_SIZE(x)(sizeof(x)/sizeof((x)[0]))```#判断数字```c#de......
  • 17.SpringCloud Alibaba-OSS
    开通阿里云OSShttps://www.aliyun.com/product/oss?spm=5176.19720258.J_3207526240.32.e93976f4xq6CZt创建Bucket   上传图片到OSS的方式由于上传需要验证所......
  • 实验一
    实验任务一源代码//打印垂直两个字符小人#include<stdio.h>intmain(){printf("o\n");printf("<h>\n");printf("II\n");printf("o\n");......
  • 路飞项目day05
    昨日内容回顾#1前端首页#2轮播图接口Banner.vue---->created--->axios--->渲染在页面上v-if#3git介绍-软件,版本管理软件-代码版本管......
  • 在线设计器 DesignO 的分析
    需求分析现有POD网站的在线编辑器不是很好用。可配置性不强,素材无法在后台实现管理可扩展性不强,无法应用于多个行业,比如包装、服装产品分析官方网站:https://www.de......
  • vue:v-bind
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><scriptsrc="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></......