• 思考一种好的架构(十二)


    程序集扫描库(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、...

  • 相关阅读:
    为什么不要用VSCODE来写Makefile
    JavaFX第三弹
    javaFX文件和文件夹选择器
    写了一个vsftpd的GUI
    在java中调用shell命令和执行shell脚本
    正交投影与斯密特正交化的好处
    Linux下安装软件
    C++中的仿函数
    C++中重载操作符[ ]
    使用斐波那契查找
  • 原文地址:https://www.cnblogs.com/AnAng/p/12612592.html
Copyright © 2020-2023  润新知