首页 > 其他 > 详细

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

时间:2020-04-01 16:05:02      阅读:42      评论:0      收藏:0      [点我收藏+]

 

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!