zoukankan      html  css  js  c++  java
  • 思考一种好的架构(十二)

    程序集扫描库(ReferenceScan)

    是什么?

      服务间会有各种相互依赖和引用,这势必会造成争夺ConfigureServices,到最后牵一发而动全身。于是很自然的出现了它来解决这个问题,

    为什么?

      为了解决服务争夺ConfigureServices注册顺序而诞生的库,他就是各个服务的带头人,一定是它最先注册

    怎么做?

     

    没有任何引用,非常简单

      /// <summary>
        /// 扫描执行接口
        /// 扫描后将会执行Execute函数
        /// </summary>
        public abstract class BaseStartExecute
        {
            public BaseStartExecute() { 
            
            }
    
            /// <summary>
            /// 执行函数
            /// </summary>
            public abstract void Execute();
        }

    这就是前几节看到的BaseStartExecute

     public class Scan
        {
    
            public static void QueryAssemblies<T>() where T : BaseStartExecute
            {
                List<T> StartExecutes = new List<T>();
                var referenceScanDoMainName = typeof(Scan).Assembly.FullName;
                foreach (var item in System.AppDomain.CurrentDomain.GetAssemblies())
                {
                    if (item.GetReferencedAssemblies().Where(x => x.FullName.Equals(referenceScanDoMainName)).Count() > 0)
                    {
                        StartExecutes.AddRange(CreateAllInstancesOf<T>(item));
                    }
                }
                foreach (var item in StartExecutes)
                {
                    item.Execute();
                }
            }
            public static void QueryAssemblies()
            {
                List<BaseStartExecute> StartExecutes = new List<BaseStartExecute>();
                var referenceScanDoMainName = typeof(Scan).Assembly.FullName;
                foreach (var item in System.AppDomain.CurrentDomain.GetAssemblies())
                {
                    if (item.GetReferencedAssemblies().Where(x => x.FullName.Equals(referenceScanDoMainName)).Count() > 0)
                    {
                        StartExecutes.AddRange(CreateAllInstancesOf<BaseStartExecute>(item));
                    }
                }
                foreach (var item in StartExecutes)
                {
                    item.Execute();
                }
            }
            public static IEnumerable<T> CreateAllInstancesOf<T>(Assembly assembly)
            {
                return assembly.GetTypes() //获取当前类库下所有类型
                    .Where(t => typeof(T).IsAssignableFrom(t)) //获取间接或直接继承t的所有类型
                    .Where(t => !t.IsAbstract && t.IsClass) //获取非抽象类 排除接口继承
                    .Select(t => (T)Activator.CreateInstance(t)); //创造实例,并返回结果(项目需求,可删除)
            }
        }

    很简单的功能,扫描所有程序集并判断有没有引用ReferenceScan,因为BaseStartExecute在这,所以服务如果想要快人一步必须会要引用ReferenceScan,

    然后实例化并执行Execute功能

     它在这

    很简单的服务

    ----

    第一部分就到此结束了

    很简单的介绍了下用包来作为为服务划分的SOA架构

    后续将会有

      1、快速生成基础设施服务、业务服务、并包含单元测试,不再需要手动创建

      2、nuget的快速交付(CD),也就是推代码后自动更新版本,自动发布到仓库

      3、APIDoc.Swagger的支持

      4、有状态的服务

      5、异常处理服务

      6、操作日志

      7、...

  • 相关阅读:
    Lombok Pojo默认初始值问题
    spring boot打包以及centos下部署
    Spring事件监听ApplicationListener源码流程分析
    synchronized是什么,用法及原理
    Spring动态切换数据源及事务
    linux环境中关闭tomcat,通过shutdown.sh无法彻底关闭--线程池
    LVS之DR模式
    LVS之ipvsadm命令
    LVS之NAT模式
    tcpdump抓包命令
  • 原文地址:https://www.cnblogs.com/AnAng/p/12612592.html
Copyright © 2011-2022 走看看