2020年12月5日星期六

.Net编码规范整理(一)

前言

  此处只是整理并记录下.Net开发规范以便加深编码规范。自己编码一直都是随心所欲,特别是在Java和C#之间来回切换,导致命名也乱七八糟完全没有规范可言。一个良好的编程规范可以提升程序员的开发效率、提高程序的易读性、提高代码的可维护性等,本文分两部分:通用规范、.Net开发规范。

 

通用编程规范    

  1. 明确性和一致性

一定要要确保代码的明确性、易读性尽量保证清晰简洁,如函数的命名及该有的注释必须要有,让别人一看函数就知道该函数是干什么用的。

    

 

  2. 库的使用

删除不需要的库引用。

 

  3. 尽量少用全局

    尽量少用全局变量,如果要用只读不修改影响不大,但涉及变量的修改就一定要检查变量更改对其它地方的影响,在VS中用"查找所有引用"核查所有用到的代码。

    

  

  4. 变量申明和初始化

    1. 在变量申明时进行初始化;
    2. 一定在最小作用域内申明它,一般申明于作用域顶端;
    3. 变量初始化置于同一行,推荐每行只包含一句申明;

    

 

  5. 函数申明和调用

    1. 函数名称,返回值,参数原则置于同一行;
    2. 过多参数一个参数一行(推荐);
    3. 多个输入参数时建议对输入参数进行排序;
    4. 当存在多个重构函数时,扩展参数因往后追加;
    5. 当存在输出参数时候,输出参数放末尾或开头;    
 1   static void Main(string[] args) 2   { 3    string logMsg = null; 4    string erroMsg = null; 5    string userName = "zhangsan"; 6    string userPwd = "123456"; 7  8    //如果参数较少,可放置一行调用 9    string result = DoSomeFunctionCall(userName, userPwd, false, out logMsg, out erroMsg);10 11    //如果参数较多情况下,可用如下方式进行调用12    string result2 = DoSomeFunctionCall(13     userName, 14     userPwd, 15     false,16     out logMsg,17     out erroMsg);18 19    Console.WriteLine($"result={result}, result2={result2}");20   }21 22   /// <summary>23   /// 示例函数描述信息24   /// </summary>25   /// <param name="userName">用户名</param>26   /// <param name="userPwd">用户密码</param>27   /// <param name="isRememberPwd">是否记住密码</param>28   /// <param name="logMsg">日志信息</param>29   /// <param name="errorMsg">错误信息</param>30   private static string DoSomeFunctionCall(31    string userName, 32    string userPwd, 33    bool isRememberPwd,34    out string logMsg, 35    out string errorMsg) {36 37    logMsg = null;38    errorMsg = null;39 40    //Do Something41 42    return "some result";43   }

 

  6. 枚举

    将代表某些值集合的强类型参数,属性和返回值声明为枚举类型。

 

  7. 空格

    空行:适度增加空行来增加代码的可读性;

    空格:可使用VS回车自动格式化了;

 

  8. 注释

    注释最好简洁明了,一定不要过多的冗余注释,一般注释包括:文件头注释、函数注释、多行注释、单行注释、内联注释、代码快注释。

/* 文件头注释:描述整个类的主要用途,如此类主要用于测试使用。 */using System;using System.ServiceProcess;using System.Threading;namespace StartServices{ class Program {  /// <summary>  /// 函数注释:控制台函数入口  /// </summary>  /// <param name="args"></param>  static void Main(string[] args)  {   string logMsg = null;   string erroMsg = null;   string userName = "zhangsan";   string userPwd = "123456";   //单行注释:如果参数较少,可放置一行调用   string result = DoSomeFunctionCall(userName, userPwd, false, out logMsg, out erroMsg);   /*    * 多行注释:    * 如果参数较多情况下,可用如下方式进行调用    */   string result2 = DoSomeFunctionCall(    userName,  //内联注释:用户名    userPwd,  //密码    false,   //是否记住密码    out logMsg,  //日志信息输出    out erroMsg); //错误信息输出   #region 代码块注释:控制台数据输出   Console.WriteLine($"result={result}, result2={result2}");   Console.WriteLine($"result={result}, result2={result2}");   Console.WriteLine($"result={result}, result2={result2}");   Console.WriteLine($"result={result}, result2={result2}");   Console.WriteLine($"result={result}, result2={result2}");   Console.WriteLine($"result={result}, result2={result2}");   

恒大重建曝光:2大外援走人,2大归化球员回归,卡帅爱将恐被清洗_卡纳瓦罗

原标题:恒大重建曝光:2大外援走人,2大归化球员回归,卡帅爱将恐被清洗

随着亚冠出局,意味着广州恒大队史首次单赛季没有冠军入账,作为主帅的卡纳瓦罗,带队带成了史上最差的一个赛季。恒大拥有中超最豪华的阵容,结果踢成糟糕的成绩,卡纳瓦罗自然是主要的原因,与此同时,现在队长郑智出任俱乐部总经理,球队下赛季不可避免要面临重建阵容。

广州恒大这个赛季没有拿到任何一个冠军,问题自然是众多的,比如几大外援发挥不稳、归化球员状态下降、本土球员进步较小、主力阵容没有固定、卡纳瓦罗固执用人等等。

带队成绩不佳,卡纳瓦罗的决定权已经被恒大俱乐部剥夺,现有的阵容将面临重组。今日,PP体育发文分析认为,广州恒大看似重新聚集了一批年轻国脚,以及拥有豪华的外援+归化球员班底,实则是一只纸老虎,球队重建,势在必行,具体是调整外援名单,并且对于归化球员一视同仁。

关于外援,本赛季广州恒大只有保利尼奥、塔利斯卡、朴志洙,在上个月中超结束之后,确定朴志洙要回国服兵役,而卡纳瓦罗钦点加盟恒大的塔利斯卡,下赛季被清洗的可能性极大,因为本赛季始终找不回好的状态,拖累了恒大进攻,影响很大,而卡纳瓦罗没有决定权或者下课之后,塔利斯卡自然很难留在球队,而保利尼奥不受影响。

归化球员方面,留下洛国富无疑是卡纳瓦罗的最大败笔,状态还不如一名本土球员,却能够顶替高拉特报名中超联赛。与此同时,全年无一运动战进球的艾克森,状态不稳,发挥远不如被租借出去的阿兰,两人有可能会存在一进一出,而高拉特已经回归,洛国富自然会被放弃。

本土球员方面,张修维、何超、廖力生、杨立瑜等中生代球员,在本赛季进步不大,让恒大球迷看不到希望,尤其是张修维,卡纳瓦罗给予大量出场机会的情况下,看不到进步地方,跟黄博文和郑智差距太大了。上赛季张修维没有被租借出去,不排除下赛季离开恒大,毕竟在恒大中场没有竞争力。

过段时间恒大全队进入放假状态,到时候重新集结的时候,成为俱乐部总经理的郑智,自然会对球队阵容继续调整。返回搜狐,查看更多

责任编辑:

原文转载:http://sport.shaoqun.com/a/373742.html

dmm.adult:https://www.ikjzd.com/w/2026

krazy:https://www.ikjzd.com/w/1801

aeo:https://www.ikjzd.com/w/2356


原标题:恒大重建曝光:2大外援走人,2大归化球员回归,卡帅爱将恐被清洗随着亚冠出局,意味着广州恒大队史首次单赛季没有冠军入账,作为主帅的卡纳瓦罗,带队带成了史上最差的一个赛季。恒大拥有中超最豪华的阵容,结果踢成糟糕的成绩,卡纳瓦罗自然是主要的原因,与此同时,现在队长郑智出任俱乐部总经理,球队下赛季不可避免要面临重建阵容。广州恒大这个赛季没有拿到任何一个冠军,问题自然是众多的,比如几大外援发挥不稳、
跨境通电子商务:跨境通电子商务
55海淘网:55海淘网
西安《七大博物馆》 - :西安《七大博物馆》 -
自由旅行者赴台旅游签证如何办理?:自由旅行者赴台旅游签证如何办理?
2020深圳东部华侨城端午节活动?端午节去东部华侨城怎么玩:2020深圳东部华侨城端午节活动?端午节去东部华侨城怎么玩

期待!又将有四部TVB剧集明年年初开拍,传钟嘉欣将参演《巾帼4》

原标题:期待!又将有四部TVB剧集明年年初开拍,传钟嘉欣将参演《巾帼4》

本文编辑剧透社:issac

未经授权严禁转载,发现抄袭者将进行全网投诉

相信对于港剧迷来说,今年TVB的确给了大家不小的惊喜与期待。

从开年的《黄金有罪》到上半年的《降魔的2.0》以及《十八年后的终极告白》,暑期档的《杀手》、《反黑路人甲》再到如今台庆档的《踩过界2》都相当值得一看,可谓各有各的精彩。

早前TVB放出了明年要播映的20多部待播剧的精彩片段,包含了警匪、医疗、神话等多种类型的剧集。其中不乏一些大制作剧集,可谓吊住了大家的胃口。因此可以毫不夸张的说,明年将会是又一个港剧大年。

令人惊喜的是,又将有四部TVB剧集将在明年年初相继开拍,集合悬疑、家庭、警匪等题材。

下面,就跟着小编一起来看看,到底是哪四部剧集将在明年年初正式启动开拍了?

一.《凶宅清洁师》

听这部剧的剧名,其实感觉稍微有一点恐怖。但熟悉TVB的朋友都知道,货不对版一向是TVB的拿手好戏。

虽然叫凶宅清洁师,但最后都有可能拍成爱情故事。

其实该剧的片名已经出现在了之前的巡礼活动中,因此可以估计,这部剧应该能够在明年年底和观众见面。

这部剧也算是TVB的小制作剧集,演员阵容相对来说比较薄弱。由洪永城、傅嘉莉、C君、陆永、赖慰玲等人联合主演。如果小编没有记错的话,这也应该是傅嘉莉首次担当第一女主角的剧集。

二.《十月初五的月光》(翻拍)

之前一直传闻这部剧要翻拍,如今终于得到了落实。剧集将在明年年初二月开拍,胡鸿钧将担当男主角,饰演初哥哥,而女主角则由2017年香港小姐亚军,长相甜美的何依婷担当。另外薛家燕原本的角色将由米雪出演,司徒礼信则由罗天宇出演。

小编觉得,TVB能够翻拍自己的经典之作,也算是一种突破了。只是当年佘诗曼、张智霖、马浚伟等人的演出实在是给人印象太深刻,想要超越原作,无论是导演、编剧,甚至是一众演员们都要动动脑筋了。

三.《黑社会》

听剧名,应该是一部警匪剧。目前得知该剧的演员阵容只有两个,敖嘉年和绿叶演员林利。

与早前流传出的敖嘉年首度担当男主角,并且和刚刚加入星梦娱乐的JW合作,并且由金牌监制潘嘉德监制的剧集,应该不是同一部剧集。

另外,这部剧将会是一部大制作合拍剧,因此敖嘉年估计不会是第一男主角。不知到时候又会有哪些演员加入其中,大家拭目以待吧!

四.《巾帼枭雄4》

早前突然传出邓萃雯将回巢,三度联手黎耀祥拍摄《巾帼枭雄4》的传闻,相信也是令不少观众相当期待。毕竟《巾帼枭雄》作为TVB近20年来的最为经典的系列之一,期待度和号召力都是不用说的。

目前《巾帼枭雄4》的主演已经在网上流传开来,并且暂定在明年三月正式开拍,也将是一部合拍剧。

除了由黎耀祥、邓萃雯压阵外,钟嘉欣、马国明、萧正楠、朱晨丽、海俊杰等人均在主演之列,这个阵容相当豪华。只是,早前钟嘉欣已经宣布拍完《儿科医生》后就会回归家庭,因此这份演员名单也有待考证。

回首2020年,大家也发现了TVB已经有了短暂的"回春"势头,相信在即将到来的2021年,TVB又会给大家带来更多的精彩!不知,这四部即将开拍的剧集,大家最期待哪一部呢?返回搜狐,查看更多

责任编辑:

原文转载:http://yl.shaoqun.com/a/210655.html

camel:https://www.ikjzd.com/w/331.html

四海商舟:https://www.ikjzd.com/w/1516

铭宣:https://www.ikjzd.com/w/1551.html


原标题:期待!又将有四部TVB剧集明年年初开拍,传钟嘉欣将参演《巾帼4》本文编辑剧透社:issac未经授权严禁转载,发现抄袭者将进行全网投诉相信对于港剧迷来说,今年TVB的确给了大家不小的惊喜与期待。从开年的《黄金有罪》到上半年的《降魔的2.0》以及《十八年后的终极告白》,暑期档的《杀手》、《反黑路人甲》再到如今台庆档的《踩过界2》都相当值得一看,可谓各有各的精彩。早前TVB放出了明年要播映的20
环球华网:环球华网
心怡物流:心怡物流
深圳仙湖弘法寺怎么样?好玩吗?:深圳仙湖弘法寺怎么样?好玩吗?
中山新月城好玩吗?:中山新月城好玩吗?
海珠湿地公园樱花节学生票多少钱?广州海珠湿地公园学生门票价:海珠湿地公园樱花节学生票多少钱?广州海珠湿地公园学生门票价

"美国众神"明年1月回归 第三季发预告

原标题:"美国众神"明年1月回归 第三季发预告

   时光网讯 Starz旗下的美剧 《美国众神》,今日发布了第三季新预告片,明年1月10日回归。这一次,第二季最终集中留下的许多超现实主义问题,也许终于会得到解决。本剧改编自 尼尔·盖曼的畅销小说,探讨了人类与神间的冲突。

第二季最后,许多剧中的角色悬而未决,战争局势更加紧张。第三季中,影月( 里基·怀托饰)想要走出自己的一条路,放弃身为神的身份,但他很快就会知道,没有人能逃脱命运的安排。影月藏身在美国威斯康辛州的一个寒冷小镇上,他在这里发现了黑暗秘密,也在探索着自己身上的神性。

伊恩·麦柯肖恩、 艾米莉·布朗宁与 叶缇黛·拜达克等人均回归出演第三季。摇滚歌手 玛丽莲·曼森最新加盟,出演北欧死亡金属乐队"Blood Death"的主唱——嗜血的Johan Wengren,这一角色听上去跟曼森本人的气质非常合适。Wengren和他的"Blood Death"乐队,也是星期三先生(伊恩·麦柯肖恩饰)在与新神的战争中,能量来源之一。返回搜狐,查看更多

责任编辑:

原文转载:http://yl.shaoqun.com/a/210647.html

邮乐购物商城:https://www.ikjzd.com/w/1776

拍拍网:https://www.ikjzd.com/w/2205

好卖家:https://www.ikjzd.com/w/776


原标题:"美国众神"明年1月回归第三季发预告  时光网讯 Starz旗下的美剧《美国众神》,今日发布了第三季新预告片,明年1月10日回归。这一次,第二季最终集中留下的许多超现实主义问题,也许终于会得到解决。本剧改编自尼尔·盖曼的畅销小说,探讨了人类与神间的冲突。第二季最后,许多剧中的角色悬而未决,战争局势更加紧张。第三季中,影月(里基·怀托饰)想要走出自己的
55海淘:55海淘
萌店:萌店
厦门:厦门
北京西站有到机场的大巴吗?:北京西站有到机场的大巴吗?
口述:拼了命也要和她在一起(6/6):口述:拼了命也要和她在一起(6/6)

40岁张鲁一饰演13岁嬴政,被吐槽“像个宦官”!被质疑扮嫩刘嘉玲霸气回应争议

原标题:40岁张鲁一饰演13岁嬴政,被吐槽"像个宦官"!被质疑扮嫩刘嘉玲霸气回应争议

图/文:达人钧钧

独家原创!未经授权严禁任何公众号或其他自媒体转载!

抄袭者一概举报

近日,由段奕宏等人主演的电视剧《大秦赋》成功接档《隐秘而伟大》在央视八套上映!这部剧在刚开播的时候就引来了一波好评!在某软件中这部剧的评分现在已经达到了8.7分!当然这部剧也有许多吐槽点,现在最大的吐槽点无疑是张鲁一饰演的嬴政了。

喜欢历史的朋友一定知道,嬴政当时是在13岁继承的王位!而剧中的剧情现在还是嬴政的爹坐在王位!

这说明张鲁一饰演的嬴政现在连13岁都没有!这其中的年龄差可想而知,就算是磨皮滤镜开到20级都无法掩盖这年龄差吧!历史中嬴政是39自封为皇帝,而张鲁一今年已经有40岁了,你要是说他统一六国了恐怕都有人信。在看的时候想不跳戏都有点难了!

除了年龄之外,不少人吐槽气质也不符合!秦始皇嬴政,统一六国的一代枭雄,浑身都散发着王者气质!而张鲁一饰演的嬴政却缺少了王的霸气!

不过这些可能是因为年龄差所带来的感觉吧,他这样的年纪来饰演少年嬴政多少有点牵强。

其实剧组完全可以在开拍的时候找一个年龄相仿的来饰演少年嬴政,到后面再由张鲁一饰演中年时期的嬴政。

说起少年时期的嬴政让我想起了翁斐然小朋友饰演的少年嬴政!不管是气质还是眼神都太像是少年时期的嬴政!尤其是那双眼睛,充满了戏!他将少年帝王的孤傲诠释的淋漓尽致,不得不佩服!

不少网友在看过之后表示"张鲁一的嬴政看上去非常违和"。还有网友表示"十三岁确实应该找个小演员"!还有网友表示"哪有一点帝王之气,演得像个宦官"。还有不少网友吐槽表示这部剧选角好失败。

不过这并不能说明张鲁一演技不好!相反,其实有很多人都非常喜欢看他饰演的作品!比如《新世界》、《麻雀》等作品都有他参演!并且还曾获得许多奖项。而这部剧才刚刚开播,说不定后续会有什么惊喜在等待着我们!让我们一起期待下吧。

其实这种不符合实际年龄出演角色的事件已经不是第一次了!就好比前段时间议论声非常大的新版《半生缘》,其中主演刘嘉玲和蒋欣也是因为年龄问题而惨遭网友们的吐槽!

《半生缘》这部剧原著是由蒋勤勤和吴倩莲主演的,当时两位主演可以说是有倾国倾城的容貌!

而刘嘉玲和蒋欣等人就算保养得再好,也没有办法完全掩盖住岁月的痕迹。

而对于这件事情,刘嘉玲还做出了回应表示"我真的没有一点纠结过我的年龄的问题,我适不适合演这个角色"。在最后她还说到"我老是觉得顾曼璐就是我来演的"。不难看出她还是蛮自信的!不愧是上海滩大哥的女人!

相同的案例还有很多,比如李晨在《幸福里的故事》中扮演一位十几岁的高中生、郑恺在《那年青春我们正好》中扮演一位十几岁叛逆少年。现在不少演员尝试扮演年龄相差过大的角色,但是基本上都是以失败告终。

如今张鲁一在事业上也有一番成绩了!至于说这部戏为什么要让张鲁一来饰演少年嬴政我们也不得而知了。现在就希望少年时期的嬴政赶快过去!你们说呢?

返回搜狐,查看更多

责任编辑:

原文转载:http://yl.shaoqun.com/a/210632.html

菜鸟网:https://www.ikjzd.com/w/1547

铭宣海淘:https://www.ikjzd.com/w/1551

淘粉8:https://www.ikjzd.com/w/1725


原标题:40岁张鲁一饰演13岁嬴政,被吐槽"像个宦官"!被质疑扮嫩刘嘉玲霸气回应争议图/文:达人钧钧独家原创!未经授权严禁任何公众号或其他自媒体转载!抄袭者一概举报近日,由段奕宏等人主演的电视剧《大秦赋》成功接档《隐秘而伟大》在央视八套上映!这部剧在刚开播的时候就引来了一波好评!在某软件中这部剧的评分现在已经达到了8.7分!当然这部剧也有许多吐槽点,现在最大的吐槽点无疑是张鲁一饰演的嬴政了。喜欢历
kkr:kkr
mail.ru:mail.ru
泡温泉一次多长时间最好?:泡温泉一次多长时间最好?
乳源大峡谷5月有什么活动?韶关乳源大峡谷2020最新门票价:乳源大峡谷5月有什么活动?韶关乳源大峡谷2020最新门票价
珠海哪里买衣服好?:珠海哪里买衣服好?

GMV同比增长超200%,这个独立站大卖黑五赚翻了!

黑五网一过去也有几天了,一起来瞻仰下大卖晒出的成绩单吧。


前天晚上,广州本土独立站大卖棒谷科技公布了其黑五战报,小编已经准备好鼓掌了!


小编了解到,今年黑五,棒谷的促销活动从十一月中旬开始,持续到十一月底,共进行三个主要的促销阶段。


据悉,在黑五当天有近2000家供应商参加本次活动,GMV(成交总额)同比增长205.26%,开场仅10分钟交易就超过了去年1小时!


今年黑五,歪果仁都屯了些什么物件呢?棒谷给了我们答案


最受欢迎的产品品类依次是玩具航模、五金工具、3C电子、电脑&办公、电子配件。


最畅销的单品依次是POCO X3智能手机、BW-FYE7 TWS耳机、FIIDO D4s电动车、Xiaomi Mi band 5 手环和Eachine E520S无人机。


最受欢迎的品牌TOP5见下图:


棒谷品牌.jpg

 (图源棒谷官方公众号)


毋庸置疑,各国家各地区之间消费者的购买行为是有差异的。不同国家的歪果仁和棒谷之间又碰撞出了怎样的火花呢?


美国,五金工具类产品销量夺得冠军宝座,美国人爱动手的特质暴露无遗了......


意大利,单车充气泵的销量增长了6.5倍,意大利人钟爱户外活动,出门骑行那必须得把装备安排妥当了。


德国,游戏显示器的销量暴涨26倍,这就不禁让人猜想,疫情期间德国人的游戏水平是不是会突飞猛进......


法国,智能马桶盖暴涨10倍,不得不说,法国人还是一如既往地注重生活品质啊。


除了以上这些喜人的销售数据,棒谷还分享了它在本次大促活动的直播战况


据悉,棒谷邀请了来自巴西、德国、意大利等20个国家的80位红人,进行Banggood Live 11月大促直播,直播总时长超140个小时,触达全球5亿+人次,直播观看量同比暴涨42倍。


在去年的夏季大促中,棒谷也邀请了来自8个国家的10名高人气海外红人参与进来。


直播对我们国内的消费者来说已经是见怪不怪了,现在直播的风也渐渐吹到了国外,抓住了许多海外消费者的心。


出海之路不易,在众多跨境卖家十年如一日的奋斗之下,中国品牌在海外市场的存在感不断增强,海外消费者也对中国品牌给予了更多的认可,小编也期待着在未来听到更多跨境卖家的好消息!




原文转载:http://www.shaoqun.com/a/494942.html

克雷格:https://www.ikjzd.com/w/194

灰色清关:https://www.ikjzd.com/w/1409

黄劲:https://www.ikjzd.com/w/2426


黑五网一过去也有几天了,一起来瞻仰下大卖晒出的成绩单吧。前天晚上,广州本土独立站大卖棒谷科技公布了其黑五战报,小编已经准备好鼓掌了!小编了解到,今年黑五,棒谷的促销活动从十一月中旬开始,持续到十一月底,共进行三个主要的促销阶段。据悉,在黑五当天有近2000家供应商参加本次活动,GMV(成交总额)同比增长205.26%,开场仅10分钟交易就超过了去年1小时!今年黑五,歪果仁都屯了些什么物件呢?棒谷给
麦言:麦言
瀚霖:瀚霖
去中英街购物要注意什么?:去中英街购物要注意什么?
2020三亚对新生有优惠的景点?三亚哪些景区对新生有优惠?:2020三亚对新生有优惠的景点?三亚哪些景区对新生有优惠?
亚马逊广告关键词怎么选?亚马逊广告关键词优化技巧:亚马逊广告关键词怎么选?亚马逊广告关键词优化技巧

.Net 5 DependencyInjection 依赖注入

  • .Net DependencyInjection 依赖注入
    • 服务注册
    • 不由服务容器创建的服务
    • 服务获取
    • 生命周期
    • 作用域验证
    • 构造函数注入行为
    • Asp.Net Core,注入 Startup 的服务
    • 使用扩展方法注册服务组
    • 从 main 调用服务

依赖注入(Dependency Injection)简称DI,DI实现了控制反转(Inversion of Control,Ioc),遵循了依赖倒置原则,

DI实现解耦、不需要手动去获取或创建依赖的对象

控制反转:由容器帮我们控制对象的创建和依赖对象的注入

正转:直接获取依赖对象并手动创建对象

案例:

一些接口和类

public interface IStorage{}public class FileStorage : IStorage{ public string Read(string path) {  return File.ReadAllText(path); }}public interface IBookService{ string[] GetBooks();}public class BookService : IBookService{ public IStorage Storage { get; } public BookService(IStorage storage) {  Storage = storage; } public string[] GetBooks() {  // ...  return new string[] { }; }}

不使用依赖注入:

class Program{ static void Main(string[] args) {  // 需要创建或获取依赖  IStorage fileStorage = new FileStorage();  // 需要手动new服务并传入依赖  IBookService bookService = new BookService(fileStorage);  bookService.GetBooks(); }}

使用依赖注入:

class Program{ static void Main(string[] args) {   // 创建依赖容器   IServiceCollection serviceCollection = new ServiceCollection();   // 注册服务   serviceCollection.AddSingleton<IStorage, FileStorage>();   // 注册服务   serviceCollection.AddSingleton<IBookService, BookService>();   // 构建服务提供者   IServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();   // 获取服务,IBookService的实现BookService的依赖将自动注入   IBookService bookService = serviceProvider.GetService<IBookService>();   bookService.GetBooks(); }}

服务注册

IServiceCollection是一个ServiceDescriptor服务描述器集合,ServiceDescriptor描述了一个服务

public interface IServiceCollection :  IList<ServiceDescriptor>, ICollection<ServiceDescriptor>, IEnumerable<ServiceDescriptor>, IEnumerable { }

注册服务就是向ServiceCollection这个集合中添加ServiceDescriptor

IServiceCollection serviceCollection = new ServiceCollection();var serviceDescriptor = new ServiceDescriptor( typeof(IStorage), // 服务类型 typeof(FileStorage), // 实现类型 ServiceLifetime.Transient // 生命周期);// 清除服务serviceCollection.Clear();// 是否包含服务if (serviceCollection.Contains(serviceDescriptor)){serviceCollection.Remove(serviceDescriptor);}// 注册服务serviceCollection.Add(serviceDescriptor);// 只有容器中不存在此服务时才注册服务serviceCollection.TryAdd(serviceDescriptor);

AddSingletonAddScopedAddTransient是构建ServiceDescriptor的简便扩展方法

IServiceCollection serviceCollection = new ServiceCollection();serviceCollection.AddSingleton<IStorage, FileStorage>();serviceCollection.AddScoped<IStorage, FileStorage>();serviceCollection.AddTransient<IStorage, FileStorage>();serviceCollection.AddTransient<FileStorage>(); // 等同于 serviceCollection.AddTransient<FileStorage, FileStorage>()

在向容器注册服务时,可以填写 实现类型、工厂或者实例

IServiceCollection serviceCollection = new ServiceCollection();serviceCollection.Add(new ServiceDescriptor(typeof(IStorage),typeof(FileStorage),ServiceLifetime.Transient));FileStorage fs = new FileStorage();serviceCollection.Add(new ServiceDescriptor(typeof(IStorage), fs));serviceCollection.Add(new ServiceDescriptor(typeof(IStorage), serviceProvider => new FileStorage(), ServiceLifetime.Singleton));
方法对象自动 dispose多种实现转递参数
Add{LIFETIME}<{SERVICE}, {IMPLEMENTATION}>()
例子:
services.AddSingleton<IMyDep, MyDep>()
Add{LIFETIME}<{SERVICE}>(sp => new {IMPLEMENTATION})
例子:
services.AddSingleton<IMyDep>(sp => new MyDep())
services.AddSingleton<IMyDep>(sp => new MyDep(99));
Add{LIFETIME}<{IMPLEMENTATION}>()
例子:
services.AddSingleton<MyDep>()
AddSingleton<{SERVICE}>(new {IMPLEMENTATION})
例子:
services.AddSingleton<IMyDep>(new MyDep())
services.AddSingleton<IMyDep>(new MyDep(99))
AddSingleton(new {IMPLEMENTATION})
例子:
services.AddSingleton(new MyDep())
services.AddSingleton(new MyDep(99))

不由服务容器创建的服务

考虑下列代码:

public void ConfigureServices(IServiceCollection services){ services.AddSingleton(new Service1()); services.AddSingleton(new Service2());}

在上述代码中:

服务实例不是由服务容器创建的,框架不会自动释放服务,开发人员负责释放服务。

服务获取

GetRequiredServiceGetService区别

如果容器中不存在要获取的服务,GetRequiredService将抛出异常,GetService将返回null

使用IServiceProvider延迟获取服务

案例:

class MyService6{}class MyService5{ public IServiceProvider ServiceProvider { get; } public MyService5(IServiceProvider serviceProvider) {  ServiceProvider = serviceProvider; } public void GetService6() {  ServiceProvider.GetService<MyService6>(); }}

获取IEnumerable<>服务数组

var serviceCollection = new ServiceCollection();serviceCollection.AddSingleton<Animal, Dog>();serviceCollection.AddSingleton<Animal, Cat>();serviceCollection.AddSingleton<Animal, Pig>();var serviceProvider = serviceCollection.BuildServiceProvider(true);var animals = serviceProvider.GetService<IEnumerable<Animal>>();Console.WriteLine(animals.Count()); // 3

生命周期

有如下3种声明周期

  • Transient:临时,每次都将创建一个实例
  • Scoped:范围,作用域,对于 Web 应用程序,每次Http请求创建一个实例,也可以通过CreateScope创建一个作用域,在此作用域内只会创建一个实例
  • Singleton:单例,只会创建一个实例

有作用域的服务由创建它们的容器释放

Transient声明周期案例

class MyService : IDisposable{ public MyService() {  Console.WriteLine("MyService Construct"); // 创建一个新的实例将输出`MyService Construct` } public void Hello() {  Console.WriteLine("MyService Hello"); } public void Dispose() {  Console.WriteLine("MyService Dispose"); }}

C#2

var serviceCollection = new ServiceCollection();serviceCollection.AddTransient<MyService>();var serviceProvider = serviceCollection.BuildServiceProvider();serviceProvider.GetService<MyService>(); // 输出:MyService ConstructserviceProvider.GetService<MyService>(); // 输出:MyService ConstructserviceProvider.GetService<MyService>(); // 输出:MyService Construct

Scoped声明周期案例

var serviceCollection = new ServiceCollection();serviceCollection.AddScoped<MyService>();var serviceProvider = serviceCollection.BuildServiceProvider();serviceProvider.GetService<MyService>(); // 输出:MyService ConstructserviceProvider.GetService<MyService>(); // 无输出serviceProvider.GetService<MyService>(); // 无输出using (var serviceScope = serviceProvider.CreateScope()){ serviceScope.ServiceProvider.GetService<MyService>(); // 输出:MyService Construct serviceScope.ServiceProvider.GetService<MyService>(); // 无输出 serviceScope.ServiceProvider.GetService<MyService>(); // 无输出}// 上面作用域结束后,将自动释放服务,输出 MyService Dispose

Single声明周期案例

var serviceCollection = new ServiceCollection();serviceCollection.AddSingleton<MyService>();var serviceProvider = serviceCollection.BuildServiceProvider();serviceProvider.GetService<MyService>(); // 输出:MyService ConstructserviceProvider.GetService<MyService>(); // 无输出serviceProvider.GetService<MyService>(); // 无输出using (var serviceScope = serviceProvider.CreateScope()){ serviceScope.ServiceProvider.GetService<MyService>(); // 无输出 serviceScope.ServiceProvider.GetService<MyService>(); // 无输出 serviceScope.ServiceProvider.GetService<MyService>(); // 无输出}

作用域验证

在调用BuildServiceProvider时可以传入参数来配置是否启用作用域验证

对于Web应用程序,如果应用环境为"Development"(开发环境),默认作用域验证将启用(CreateDefaultBuilder 会将 ServiceProviderOptions.ValidateScopes 设为 true),若要始终验证作用域(包括在生存环境中验证),请使用HostBuilder上的 UseDefaultServiceProvider 配置 ServiceProviderOptions

启用作用域验证后,将验证以下内容:

  • 确保没有从根服务提供程序直接或间接解析到有作用域的服务
  • 未将有作用域的服务直接或间接注入到单一实例。

案例

class MyService2{}class MyService3{ public MyService3(MyService2 myService2) { }}

C#2

var serviceCollection = new ServiceCollection();serviceCollection.AddScoped<MyService2>();var serviceProvider = serviceCollection.BuildServiceProvider(true); // 传入true,开启作用域验证using (var serviceScope = serviceProvider.CreateScope()){ serviceScope.ServiceProvider.GetService<MyService2>(); // 正确用法}serviceProvider.GetService<MyService2>(); // 将抛出异常,因为不能从根服务提供程序直接或间接解析到有作用域的服务

C#3

var serviceCollection = new ServiceCollection();serviceCollection.AddSingleton<MyService3>();serviceCollection.AddScoped<MyService2>();var serviceProvider = serviceCollection.BuildServiceProvider(true);serviceProvider.GetService<MyService3>(); // 将抛出异常,不能将有作用域的服务直接或间接注入到单一实例

调用 BuildServiceProvider 时,会创建根服务提供程序。 在启动提供程序和应用时,根服务提供程序的生存期对应于应用/服务的生存期,并在关闭应用时释放。

有作用域的服务由创建它们的容器释放

如果作用域创建于根容器,则该服务的生存会有效地提升至单一实例,因为根容器只会在应用/服务关闭时将其释放

构造函数注入行为

服务能被获取通过:

  • IServiceProvider
  • ActivatorUtilities:创建没有在容器中注入的服务

构造函数可以使用没有在容器中注入的服务,但是参数必须分配默认值。

通过IServiceProviderActivatorUtilities解析服务时,构造函数注入需要公共构造函数

通过ActivatorUtilities解析服务时,构造函数注入要求仅存在一个适用的构造函数。 ActivatorUtilities支持构造函数重载,其所有参数都可以通过依赖项注入来实现。

案例

class MyService4{ public MyService4() {  Console.WriteLine("0 Parameter Constructor"); } public MyService4(string a) {  Console.WriteLine("1 Parameter Constructor"); } public MyService4(string a, string b) {  Console.WriteLine("2 Parameter Constructor"); }}

C#2

var serviceCollection = new ServiceCollection();serviceCollection.AddSingleton<MyService4>();var serviceProvider = serviceCollection.BuildServiceProvider(true);ActivatorUtilities.CreateInstance<MyService4>(serviceProvider); // 0 Parameter ConstructorActivatorUtilities.CreateInstance<MyService4>(serviceProvider, "Param 1"); // 1 Parameter ConstructorActivatorUtilities.CreateInstance<MyService4>(serviceProvider, "Param 1", "Param 2"); // 2 Parameter ConstructorActivatorUtilities.CreateInstance<MyService4>(serviceProvider, "Param 1", 12);// 抛出异常,没有找到合适的构造函数ActivatorUtilities.CreateInstance<MyService4>(serviceProvider, "Param 1", "Param 2", "Param 3");// 抛出异常,没有找到合适的构造函数

Asp.Net Core,注入 Startup 的服务

服务可以注入 Startup 构造函数和 Startup.Configure 方法

使用泛型主机 (IHostBuilder) 时,只能将以下服务注入 Startup 构造函数:

  • IWebHostEnvironment
  • IHostEnvironment
  • IConfiguration

任何向 DI 容器注册的服务都可以注入 Startup.Configure 方法:

public void Configure(IApplicationBuilder app, ILogger<Startup> logger){}

使用扩展方法注册服务组

ASP.NET Core 框架使用一种约定来注册一组相关服务。 约定使用单个 Add{GROUP_NAME} 扩展方法来注册该框架功能所需的所有服务。 例如,AddControllers 扩展方法会注册 MVC 控制器所需的服务

从 main 调用服务

使用 IServiceScopeFactory.CreateScope 创建 IServiceScope 以解析应用范围内的作用域服务。 此方法可以用于在启动时访问有作用域的服务以便运行初始化任务。

以下示例演示如何访问范围内 IMyDependency 服务并在 Program.Main 中调用其 WriteMessage 方法:

public class Program{ public static void Main(string[] args) {  var host = CreateHostBuilder(args).Build();  using (var serviceScope = host.Services.CreateScope())  {   var services = serviceScope.ServiceProvider;   try   {    var myDependency = services.GetRequiredService<IMyDependency>();    myDependency.WriteMessage("Call services from main");   }   catch (Exception ex)   {    var logger = services.GetRequiredService<ILogger<Program>>();    logger.LogError(ex, "An error occurred.");   }  }  host.Run(); } public static IHostBuilder CreateHostBuilder(string[] args) =>  Host.CreateDefaultBuilder(args)   .ConfigureWebHostDefaults(webBuilder =>   {    webBuilder.UseStartup<Startup>();   });}








原文转载:http://www.shaoqun.com/a/494932.html

reverb:https://www.ikjzd.com/w/1273

haofang:https://www.ikjzd.com/w/1046

patents:https://www.ikjzd.com/w/857


.NetDependencyInjection依赖注入服务注册不由服务容器创建的服务服务获取生命周期作用域验证构造函数注入行为Asp.NetCore,注入Startup的服务使用扩展方法注册服务组从main调用服务依赖注入(DependencyInjection)简称DI,DI实现了控制反转(InversionofControl,Ioc),遵循了依赖倒置原则,DI实现解耦、不需要手动去获取或创建依
ola:ola
topia:topia
龙华汽车站到南澳西冲坐什么车?:龙华汽车站到南澳西冲坐什么车?
春节去珠海长隆人多吗?珠海长隆春节好玩吗?:春节去珠海长隆人多吗?珠海长隆春节好玩吗?
从罗湖过关到香港尖沙咀怎么走?:从罗湖过关到香港尖沙咀怎么走?

柳云龙新剧《叱咤之城》曝光,又一部谍战戏,希望这次别等5年

原标题:柳云龙新剧《叱咤之城》曝光,又一部谍战戏,希望这次别等5年

头号电影院懂小姐(topcinema原创,严禁转载)

柳云龙,国内影视圈内极少数的另类男演员。

从《暗算》开始,他多年来一直痴迷于谍战剧,演戏求精不求量,被誉为国内"谍战剧之父",但因为题材等其他多种原因,之前好几部戏都拖了几年才艰难开播。

《风筝》从2012年拍摄到开播,足足等了5年,2017年终于开播后评分一路冲高,被很多观众喜欢,又成为一部被捧在手心里的好剧。

另外一部搁置多年的《胜算》,也经历了各种延期,从2015年拍摄,终于在今年开播,也是又一个5年。

不过,最新的消息是,他有一部新剧已经提上日程:

电视剧《叱咤之城》

有人在网上爆料称,这部电视剧将由柳云龙和另外一位S姓大牌男星主演,不过,就在很多人为之激动时,这位爆料人又在下面留言说:谨慎吃瓜。

也就是说,对于自己爆料的消息,这位爆料人也并非百分百的确定。

而另据相关知情人士透露,以上那个爆料中提及的S姓男星其实与这部剧无关,但应该有柳云龙。所以,又可以期待一下柳云龙的新剧了,很多观众已经提前激动起来了。

其实,这部名为《叱咤之城》的电视剧,今年7月已经立项公示,故事梗概中可以看出,是一部以两兄弟为主角,讲述在那个风云变幻年代的谍战题材新剧——

凌云洲出生于国民政府高官家庭,留学国外多年,1939年返国,在哥哥凌岳州的帮助下,进入孤岛时期的上海金融圈,利用数学才能和经济头脑,辗转进入汪伪经济专门委员会工作。凌岳州时任伪政权上海检察长,暗地里为重庆政府效力。

上海船运大亨江氏独女江澄子身世复杂,与凌云洲相逢后,恋爱,结婚,但却同床异梦。彼时上海活跃着若干抗日民间组织,其中一个组织的领导是酒楼女经理罗亭。

凌云洲和罗亭成为了意气相投的生死之交,在党的领导下,他们与日本殖民机构、汉奸银行进行暗战,数次阻止日本侵华机构从祖国土地上攫取真金白银,在经济领域破坏日伪的清乡行动,帮助抗日根据地筹措军用物资,最终迎来了抗日战争的胜利。

这样的剧情里,有时代风云,有兄弟关系,有儿女情长,都放在暗战这个大背景下,的确是柳云龙很擅长的题材。

就是不知道,最终会是哪位男演员,和柳云龙在这部剧里演兄弟俩呢?还是可以好好期待一番的。

提到柳云龙,对待演戏从来不含糊的他,却是那种在网上特别"散淡"的男演员,从来不会精心运营自己的社交账号,发点内容也是有一搭没一搭地看心情,不知道"人设"是何物的明星。

一直"低产"的柳云龙,就这样慢慢在圈内活成了一个传奇式的演员,虽然对剧本挑剔,但他其实是一个对观众影迷很热心的人:看上去很酷,实际上是个暖男,而且内心世界细腻而敏感。

柳云龙早在2011年就开了某社交账号,但当时只发了一句"呵呵,大家好,我也有XX了",就没了下文。直到2017年底,《风筝》在5年后解禁开播后,柳云龙才又发了第二条内容——

一张图片,上面是他闭着眼,躺在疑似工作室的沙发或者床上,文字内容只有几个字,却能让人看出他这些年背负着的种种,他写道:没有月岁可回头。

《风筝》开播后,也没有辜负柳云龙和他的一帮兄弟们,尤其是剧中的几位"山城F4",戏里戏外都结下了深厚情谊。

而在《胜算》里,柳云龙又继续和其中的两位合作,"宫庶"孙斌没有出现,还被不少《风筝》的影迷念叨了好久。

就在10月,好久不发声的柳云龙,罕见连发两条内容,都是自己之前的片场照。其中一张,柳云龙发挥了自己的幽默感,调侃这张照片说:胳膊演的不错。

结果这张照片很快被影迷认出是在2012年的《铁血壮士》片场,柳云龙在剧中饰演谢云汉,这是一位有勇有谋,令人敬佩的铁汉英雄,最终粉碎了日军阴谋,胜利突围。

还有一张,是他在片场双眼无神,失去焦点的照片,柳云龙自己配的文字是:那时候太困了!

很快,影迷们纷纷认出这是柳云龙当年在《风筝》片场的时候,又当导演又当演员,纷纷心疼起他来。

结果,不仅影迷们心疼他,就连柳云龙在剧中搭档"影子"的扮演者、女演员罗海琼也给他留言,还发了一张柳云龙当时裹在被子里,手里夹着烟,闭目凝神的照片,写道:这是累了。

柳云龙拍戏不仅时间长,还熬得自己都憔悴犯困,由此可见,在他一部部用心的好剧背后,都是倾尽心血的付出。

等一部柳云龙的戏太难,但,值得。

继续等这部吧,希望这次别再等5年。

第一时间推荐解读好电影、好剧、好演员,人生就像一场电影,欢迎点击关注"头号电影院"返回搜狐,查看更多

责任编辑:

原文转载:http://yl.shaoqun.com/a/210600.html

知无不言:https://www.ikjzd.com/w/1308

派代:https://www.ikjzd.com/w/2197

eori:https://www.ikjzd.com/w/499


原标题:柳云龙新剧《叱咤之城》曝光,又一部谍战戏,希望这次别等5年头号电影院懂小姐(topcinema原创,严禁转载)柳云龙,国内影视圈内极少数的另类男演员。从《暗算》开始,他多年来一直痴迷于谍战剧,演戏求精不求量,被誉为国内"谍战剧之父",但因为题材等其他多种原因,之前好几部戏都拖了几年才艰难开播。《风筝》从2012年拍摄到开播,足足等了5年,2017年终于开播后评分一路冲高,被很多观众喜欢,又
亚马逊 海外购:亚马逊 海外购
联动优势电子商务:联动优势电子商务
【下半年开启】跨境新手做Shopee,不懂listing优化怎能行!:【下半年开启】跨境新手做Shopee,不懂listing优化怎能行!
2020深圳欢乐谷狂欢节什么时候开幕?:2020深圳欢乐谷狂欢节什么时候开幕?
海螺沟:雪花飘零 轻轻地我走了 - :海螺沟:雪花飘零 轻轻地我走了 -