思考一种好的架构(十二)
程序集扫描库(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、...