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

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

原文地址:https://www.cnblogs.com/AnAng/p/12612592.html