.NET架构开发应知应会

.NET程序是基于.NET Framework、.NET Core、Mono、【.NET实现】开发和运行的 ,定义以上【.NET实现】的标准规范称为.NET Standard

L1:.NET Standard

  .NET标准是一组API集合,由上层三种【.NET实现】的Basic Class Library实现,更正式的说法,由统一契约集合构成的规范,这个集合确保了在不同【.NET实现】之间的可移植性,能让你的代码 run everywhere。

  .NET Standard 也是一个 target framework。如果您的代码针对的是.NET Standard的一个版本,那它可以在任意一个 支持该.NET Standard版本的.NET实现上运行。

L2: [.NET实现]

  上图给出的是微软积极支持和维护的有三个主要的【.NET实现】:.NET Framework,.NET Core,Mono

  ①.NET Framework

    最早期的.NET 实现, 4.5+版本开始实现.NET Standard      https://docs.microsoft.com/en-us/dotnet/standard/net-standard  https://docs.microsoft.com/en-us/dotnet/standard/frameworks

    早期的微软比较闭源,.NET Framework 是为构建面向windows桌面环境而设计的,针对不同的应用程序形态设计了 WINFORM、 ASP.NET、WPF

  ②.NET Core

   是近几年微软拥抱开源的结晶,.NetCore是一个跨平台的【.NET实现】,因为原生实现了.NET Standard(完全没有版本包袱), 面向.NETStandard的代码可以在.NET Core平台上编译和运行。

   针对Web程序.NetCore准备了ASP.NECore框架, 定位是微软新一代高性能、开源、跨平台Web开发框架, 目前最新稳定版本为2.2

     另外.NetCore 3.0即将支持WINFORM、WPF, 这样将全面覆盖.Net Framework 支持的应用程序形态。

  ③ Mono   是一个微小运行时的 【.NET实现】,驱动 Xamarin,用于android,ios 等开发,支持目前所有公开的.NET standard 版本。

 本人近些年工作在.NetCore平台, 有一些宏观上的经验之谈, 可供参考。

 一:.NetCore部署目标的选择

  部署目标是在Target Framework Moniker中定义, 决定了程序的部署定位, 常见有如下2种:

  • netstandard

  • netcoreapp

  在实践中:项目早期可能是定位是 netstandard,后面随着项目演进,依赖的库越来越多,大部分都会变成netcoreapp.

  如L1所述 .NetStandard也是一个 target framework, 期望在多个运行时(.Net Framework4.5+,.NET Core, XAMARIN)上都能运作的程序应该以此框架为目标。

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard1.6</TargetFramework>
</PropertyGroup>
</Project>

  伴随项目演进, 程序依赖的某些库可能只有针对 .NetCore的版本; 从生产实际看, 部署环境只会搭配一套.Net Core运行时, 所以后期项目很大可能性会演进成针对 .Net Core的运行时部署。

<TargetFramework>netcoreapp2.2</TargetFramework>

二: 开发环境存在多SDK、多Runtime版本时,应当知晓 .NET Core工具、SDK和运行时版本选择的策略。

  ① 当运行SDK命令,会使用安装的最新版本命令

SDK命令包括dotnet new/ dotnet run,即使项目生成文件被指定为早期版本的运行时 或 安装的最新版本SDK是预览版, SDK依旧使用安装的最新SDK版本

  ② 目标框架标记target framework monikers定义编译时刻的API

编译.NetCore程序的API是在项目文件的 Target framework Moniker中定义的,

<TargetFramework>netcoreapp2.0</TargetFramework>

<TargetFrameworks>netcoreapp2.0;net47</TargetFrameworks>

  ③ 运行.NetCore程序( 框架独立的.NetCore 程序 ), 在部署服务器上会适用版本前滚的策略

在项目文件中指定了netcoreapp2.0, 在部署环境中2.0.4 是安装的最新运行时版本, 那么就会使用2.0.4运行时版本

  ④ 发布自包含的程序,自包含的部署文件会内置指定的运行时

部署自包含.NetCore 程序时, 部署文件包含了.NetCore 运行时和程序依赖的库文件,自包含项目并不依赖 部署服务器上运行时环境,运行时版本选择发生在发布阶段,而不是在运行阶段。
目前 自包含.NetCore程序使用场景不多,一般用于需要将程序应用到复杂的多种客户环境中,这种部署方式可将运行时和依赖环境打包,不用去提前知晓客户服务器运行时。

 Tip: 针对策略① 有些特殊应用场景,如果项目需要使用早期的SDK版本,可在global.json文件中指定该早期版本,规避最新策略

{
"sdk": {
"version": "2.2.3"
}
}

  本文没有大篇幅讲解 .NETCore SDK和CommandLine的用法,照葫芦画瓢即可,特别指出 部署目标的设定策略、服务器存在多SDK的选择策略, 读者可参照对比心中有数。

NET架构的更多相关文章

  1. MySQL高级知识- MySQL的架构介绍

    [TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...

  2. node服务的监控预警系统架构

    需求背景 目前node端的服务逐渐成熟,在不少公司内部也开始承担业务处理或者视图渲染工作.不同于个人开发的简单服务器,企业级的node服务要求更为苛刻: 高稳定性.高可靠性.鲁棒性以及直观的监控和报警 ...

  3. 如何一步一步用DDD设计一个电商网站(二)—— 项目架构

    阅读目录 前言 六边形架构 终于开始建项目了 DDD中的3个臭皮匠 CQRS(Command Query Responsibility Segregation) 结语 一.前言 上一篇我们讲了DDD的 ...

  4. 浅谈 jQuery 核心架构设计

    jQuery对于大家而言并不陌生,因此关于它是什么以及它的作用,在这里我就不多言了,而本篇文章的目的是想通过对源码简单的分析来讨论 jQuery 的核心架构设计,以及jQuery 是如何利用javas ...

  5. 【深入浅出jQuery】源码浅析--整体架构

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  6. DDD CQRS架构和传统架构的优缺点比较

    明天就是大年三十了,今天在家有空,想集中整理一下CQRS架构的特点以及相比传统架构的优缺点分析.先提前祝大家猴年新春快乐.万事如意.身体健康! 最近几年,在DDD的领域,我们经常会看到CQRS架构的概 ...

  7. Microservice架构模式简介

    在2014年,Sam Newman,Martin Fowler在ThoughtWorks的一位同事,出版了一本新书<Building Microservices>.该书描述了如何按照Mic ...

  8. 谈一下关于CQRS架构如何实现高性能

    CQRS架构简介 前不久,看到博客园一位园友写了一篇文章,其中的观点是,要想高性能,需要尽量:避开网络开销(IO),避开海量数据,避开资源争夺.对于这3点,我觉得很有道理.所以也想谈一下,CQRS架构 ...

  9. Windows平台分布式架构实践 - 负载均衡

    概述 最近.NET的世界开始闹腾了,微软官方终于加入到了对.NET跨平台的支持,并且在不久的将来,我们在VS里面写的代码可能就可以通过Mono直接在Linux和Mac上运行.那么大家(开发者和企业)为 ...

  10. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

随机推荐

  1. WAMP 403 Forbidden禁止访问,别的电脑访问不了;

    直接上图: 1:修改httpd.conf; deny from all 改成------ allow from all 重启服务就好了: 2:如果搜不到deny from all 就按照下面的方法来 ...

  2. 替罪羊树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

    二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 闲的没事,把各种平衡树都写写 比较比较... 下面是替罪羊树 #include <cstdio> #inc ...

  3. js判断是不是在微信浏览器打开?

    is_weixin:function(){      var ua = window.navigator.userAgent.toLowerCase();      if (ua.match(/Mic ...

  4. ciscn2019华北赛区半决赛day1web5CyberPunk

    刚比赛完的一段时间期末考试云集,没有时间复现题目.趁着假期,争取多复现几道题. 复现平台 buuoj.cn 解题过程 首先进入题目页面 看起来没有什么特别的,就是一个可以提交信息的页面.查看响应报文也 ...

  5. ubuntu之路——day10.2单一数字评估指标与满足和优化的评估指标

    单一数字评估指标: 我们在平时常用到的模型评估指标是精度(accuracy)和错误率(error rate),错误率是:分类错误的样本数站样本总数的比例,即E=n/m(如果在m个样本中有n个样本分类错 ...

  6. DELPHI开发LINUX的动态库

    DELPHI开发LINUX的动态库 WINDOWS的动态库是.dll,这个大家都知道. LINUX也有动态库,扩展名是.so,现在DELPHI也能开发LINUX的动态库哦. DELPHI对LINUX的 ...

  7. Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [spring-mybatis.xml]: Initialization of bean failed

  8. Communications link failure due to underlying exception: ** BEGIN NESTED EXC

    一是将 wait_timeout=31536000 interactive_timeout=31536000 将过期时间修改为1年. 二是在连接URL上添加参数:&autoReconnect= ...

  9. web文件上传,带进度条

    原生ajax上传带进度条 (百分比) <%@ page language="java" contentType="text/html; charset=UTF-8& ...

  10. TP5 查询 字符串条件如何实现

      TP5 查询 字符串条件如何实现 当查询条件是 (1,3,8) ,3,4) 这种情况改如何查询呢?   主要用到FIND_IN_SET $where[ ]=>['exp',Db::raw(& ...