面試
Mock
Moq
Moq是針對(duì)Net開發(fā)的模擬庫(kù)颠毙。他的目標(biāo)是讓模擬以一種自然的方式與現(xiàn)有的單元測(cè)試進(jìn)行集成魔招,使他更加直觀。
我們可以使用nuget嵌溢,來(lái)獲取Moq包眯牧。或者訪問(wèn)其官網(wǎng)赖草,不過(guò)被墻了学少。
局限性
模擬的類不能為密封類。不能直接模擬靜態(tài)方法秧骑。Moq只能創(chuàng)建模擬對(duì)象的實(shí)例版确】勰遥可以通過(guò)模擬的方式讓他去訪問(wèn)service,并且根據(jù)不同的請(qǐng)求模擬返回響應(yīng)的結(jié)果绒疗。
原理
Moq只需要一個(gè)接口侵歇,就可以產(chǎn)生一個(gè)對(duì)象。利用反射機(jī)制來(lái)動(dòng)態(tài)生成一個(gè)空框架吓蘑,用于模仿對(duì)象的行為惕虑。
Mock
通過(guò)Mock<T>這個(gè)類,我們就可以創(chuàng)建一個(gè)對(duì)象的模擬磨镶。T可以使接口或者類溃蔫。但必須有public和virtual屬性。
通過(guò)IFake接口琳猫,去動(dòng)態(tài)創(chuàng)建Mock伟叛。然后使用Setup方法去創(chuàng)建我們需要的對(duì)象。當(dāng)模擬的對(duì)象調(diào)用它自己方法的時(shí)候脐嫂,并且參數(shù)是Ping统刮。
最后Return返回對(duì)應(yīng)結(jié)果,前面的請(qǐng)求返回結(jié)果為真雹锣。這是我們指定的返回值网沾。當(dāng)請(qǐng)求調(diào)用DoSomething并且傳遞Ping癞蚕,那么就返回true蕊爵。
public interface IFake
{
bool DoSomething(string actionname);
}
[TestMethod]
public void Test_Interface_IFake()
{
var mo = new Mock<IFake>();
mo.Setup(f => f.DoSomething("Ping")).Returns(true);
mo.Setup(f => f.DoSomething("PingF")).Returns(false);
Assert.AreEqual(true, mo.Object.DoSomething("Ping"));
Assert.AreEqual(false, mo.Object.DoSomething("PingF"));
}
DB 分頁(yè)
表中主鍵必須為標(biāo)識(shí)列,[ID] int IDENTITY (1,1)
分頁(yè)方案一 (利用Not In和SELECT TOP分頁(yè))
語(yǔ)句形式:
SELECT TOP 10 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 20 id
FROM TestTable
ORDER BY id))
ORDER BY ID
SELECT TOP 頁(yè)大小 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP (頁(yè)大小*(頁(yè)數(shù)-1)) id
FROM 表
ORDER BY id))
ORDER BY ID
分頁(yè)方案二 (利用ID大于多少和SELECT TOP分頁(yè))
語(yǔ)句形式:
SELECT TOP 10 *
FROM TestTable
WHERE (ID >=
(SELECT MAX(id)
FROM (SELECT TOP 21 id
FROM TestTable
ORDER BY id) AS T))
ORDER BY ID
SELECT TOP 頁(yè)大小 *
FROM TestTable
WHERE (ID >=
(SELECT MAX(id)
FROM (SELECT TOP (頁(yè)大小*(頁(yè)數(shù)-1)+1) id
FROM 表
ORDER BY id) AS T))
ORDER BY ID
分頁(yè)方案三:(利用SQL的游標(biāo)存儲(chǔ)過(guò)程分頁(yè))
create procedure SqlPager
@sqlstr nvarchar(4000), --查詢字符串
@currentpage int, --第N頁(yè)
@pagesize int --每頁(yè)行數(shù)
as
set nocount on
declare @P1 int, --P1是游標(biāo)的id
@rowcount int
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1, @rowcount=@rowcount output
select ceiling(1.0*@rowcount/@pagesize) as 總頁(yè)數(shù)--,@rowcount as 總行數(shù),@currentpage as 當(dāng)前頁(yè)
set @currentpage=(@currentpage-1)*@pagesize+1
exec sp_cursorfetch @P1,16,@currentpage,@pagesize
exec sp_cursorclose @P1
set nocount off
其它的方案:如果沒(méi)有主鍵桦山,可以用臨時(shí)表攒射,也可以用方案三做,但是效率會(huì)低恒水。
建議優(yōu)化的時(shí)候会放,加上主鍵和索引,查詢效率會(huì)提高钉凌。
通過(guò)SQL 查詢分析器咧最,顯示比較:我的結(jié)論是:
分頁(yè)方案二:(利用ID大于多少和SELECT TOP分頁(yè))效率最高,需要拼接SQL語(yǔ)句
分頁(yè)方案一:(利用Not In和SELECT TOP分頁(yè)) 效率次之御雕,需要拼接SQL語(yǔ)句
分頁(yè)方案三:(利用SQL的游標(biāo)存儲(chǔ)過(guò)程分頁(yè)) 效率最差矢沿,但是最為通用
目前我主要是用第一,第二種方案
With(Nolock)
什么是
開發(fā)人員喜歡在SQL腳本中使用WITH(NOLOCK), WITH(NOLOCK)其實(shí)是表提示(table_hint)中的一種酸纲。它等同于 READUNCOMMITTED 捣鲸。 具體的功能作用如下所示 摘自MSDN
指定允許臟讀。不發(fā)布共享鎖來(lái)阻止其他事務(wù)修改當(dāng)前事務(wù)讀取的數(shù)據(jù)闽坡,其他事務(wù)設(shè)置的排他鎖不會(huì)阻礙當(dāng)前事務(wù)讀取鎖定數(shù)據(jù)栽惶。允許臟讀可能產(chǎn)生較多的并發(fā)操作愁溜,但其代價(jià)是讀取以后會(huì)被其他事務(wù)回滾的數(shù)據(jù)修改。這可能會(huì)使您的事務(wù)出錯(cuò)外厂,向用戶顯示從未提交過(guò)的數(shù)據(jù)冕象,或者導(dǎo)致用戶兩次看到記錄(或根本看不到記錄)。有關(guān)臟讀酣衷、不可重復(fù)讀和幻讀的詳細(xì)信息交惯,請(qǐng)參閱并發(fā)影響。
READUNCOMMITTED 和 NOLOCK 提示僅適用于數(shù)據(jù)鎖穿仪。所有查詢(包括那些帶有 READUNCOMMITTED 和 NOLOCK 提示的查詢)都會(huì)在編譯和執(zhí)行過(guò)程中獲取 Sch-S(架構(gòu)穩(wěn)定性)鎖席爽。因此,當(dāng)并發(fā)事務(wù)持有表的 Sch-M(架構(gòu)修改)鎖時(shí)啊片,將阻塞查詢只锻。例如,數(shù)據(jù)定義語(yǔ)言 (DDL) 操作在修改表的架構(gòu)信息之前獲取 Sch-M 鎖紫谷。所有并發(fā)查詢(包括那些使用 READUNCOMMITTED 或 NOLOCK 提示運(yùn)行的查詢)都會(huì)在嘗試獲取 Sch-S 鎖時(shí)被阻塞齐饮。相反,持有 Sch-S 鎖的查詢將阻塞嘗試獲取 Sch-M 鎖的并發(fā)事務(wù)笤昨。有關(guān)鎖行為的詳細(xì)信息祖驱,請(qǐng)參閱鎖兼容性(數(shù)據(jù)庫(kù)引擎)。
不能為通過(guò)插入瞒窒、更新或刪除操作修改過(guò)的表指定 READUNCOMMITTED 和 NOLOCK捺僻。SQL Server 查詢優(yōu)化器忽略 FROM 子句中應(yīng)用于 UPDATE 或 DELETE 語(yǔ)句的目標(biāo)表的 READUNCOMMITTED 和 NOLOCK 提示
使用場(chǎng)景
什么時(shí)候可以使用WITH(NOLOCK)? 什么時(shí)候不能使用WITH(NOLOCK),這個(gè)要視你系統(tǒng)業(yè)務(wù)情況,綜合考慮性能情況與業(yè)務(wù)要求來(lái)決定是否使用WITH(NOLOCK), 例如涉及到金融或會(huì)計(jì)成本之類的系統(tǒng)崇裁,出現(xiàn)臟讀那是要產(chǎn)生嚴(yán)重問(wèn)題的匕坯。關(guān)鍵業(yè)務(wù)系統(tǒng)也要慎重考慮。大體來(lái)說(shuō)一般有下面一些場(chǎng)景可以使用WITH(NOLOCK)
基礎(chǔ)數(shù)據(jù)表拔稳,這些表的數(shù)據(jù)很少變更葛峻。
歷史數(shù)據(jù)表,這些表的數(shù)據(jù)很少變更巴比。
業(yè)務(wù)允許臟讀情況出現(xiàn)涉及的表术奖。
數(shù)據(jù)量超大的表,出于性能考慮轻绞,而允許臟讀采记。
另外一點(diǎn)就是不要濫用WITH(NOLOCK),我發(fā)現(xiàn)有個(gè)奇怪現(xiàn)象,很多開發(fā)知道WITH(NOLOCK),但是有不了解臟讀铲球,習(xí)慣性的使用WITH(NOLOCK)挺庞。
區(qū)別
NOLOCK這樣的寫法,其實(shí)NOLOCK其實(shí)只是別名的作用稼病,而沒(méi)有任何實(shí)質(zhì)作用选侨。所以不要粗心將(NOLOCK)寫成NOLOCK
使用WITH(NOLOCK)后掖鱼,數(shù)據(jù)庫(kù)并不是不生成相關(guān)鎖。 對(duì)比可以發(fā)現(xiàn)使用WITH(NOLOCK)后援制,數(shù)據(jù)庫(kù)只會(huì)生成DB類型的共享鎖戏挡、以及TAB類型的架構(gòu)穩(wěn)定性鎖
update table 會(huì)阻止select 有(nolock)不會(huì)有這個(gè)阻止
alter table 始終會(huì)阻止select不論有沒(méi)有(nolock)
抽象類和接口
抽象類
抽象類是特殊的類,只是不能被實(shí)例化晨仑;除此以外褐墅,具有類的其他特性;重要的是抽象類可以包括抽象方法洪己,這是普通類所不能的妥凳。抽象方法只能聲明于抽象類中,且不包含任何實(shí)現(xiàn)答捕,派生類必須覆蓋它們逝钥。另外,抽象類可以派生自一個(gè)抽象類拱镐,可以覆蓋基類的抽象方法也可以不覆蓋艘款,如果不覆蓋,則其派生類必須覆蓋它們沃琅。
接口
接口是引用類型的哗咆,類似于類,和抽象類的相似之處有三點(diǎn):
不能實(shí)例化;
包含未實(shí)現(xiàn)的方法聲明益眉;
派生類必須實(shí)現(xiàn)未實(shí)現(xiàn)的方法晌柬,抽象類是抽象方法,接口則是所有成員(不僅是方法包括其他成員)呜叫;
另外空繁,接口有如下特性:
接口除了可以包含方法之外殿衰,還可以包含屬性朱庆、索引器、事件闷祥,而且這些成員都被定義為公有的娱颊。除此之外,不能包含任何其他的成員凯砍,例如:常量箱硕、域、構(gòu)造函數(shù)悟衩、析構(gòu)函數(shù)剧罩、靜態(tài)成員。一個(gè)類可以直接繼承多個(gè)接口座泳,但只能直接繼承一個(gè)類(包括抽象類)惠昔。
抽象類和接口的區(qū)別
類是對(duì)對(duì)象的抽象幕与,可以把抽象類理解為把類當(dāng)作對(duì)象,抽象成的類叫做抽象類.而接口只是一個(gè)行為的規(guī)范或規(guī)定镇防,微軟的自定義接口總是后帶able字段啦鸣,證明其是表述一類類“我能做。来氧。诫给。”.抽象類更多的是定義在一系列緊密相關(guān)的類間啦扬,而接口大多數(shù)是關(guān)系疏松但都實(shí)現(xiàn)某一功能的類中.
接口基本上不具備繼承的任何具體特點(diǎn),它僅僅承諾了能夠調(diào)用的方法;
一個(gè)類一次可以實(shí)現(xiàn)若干個(gè)接口,但是只能擴(kuò)展一個(gè)父類
接口可以用于支持回調(diào),而繼承并不具備這個(gè)特點(diǎn).
抽象類不能被密封中狂。
抽象類實(shí)現(xiàn)的具體方法默認(rèn)為虛的,但實(shí)現(xiàn)接口的類中的接口方法卻默認(rèn)為非虛的扑毡,當(dāng)然您也可以聲明為虛的.
(接口)與非抽象類類似吃型,抽象類也必須為在該類的基類列表中列出的接口的所有成員提供它自己的實(shí)現(xiàn)。但是僚楞,允許抽象類將接口方法映射到抽象方法上勤晚。
抽象類實(shí)現(xiàn)了oop中的一個(gè)原則,把可變的與不可變的分離泉褐。抽象類和接口就是定義為不可變的赐写,而把可變的座位子類去實(shí)現(xiàn)。
好的接口定義應(yīng)該是具有專一功能性的膜赃,而不是多功能的挺邀,否則造成接口污染。如果一個(gè)類只是實(shí)現(xiàn)了這個(gè)接口的中一個(gè)功能跳座,而不得不去實(shí)現(xiàn)接口中的其他方法端铛,就叫接口污染。
盡量避免使用繼承來(lái)實(shí)現(xiàn)組建功能疲眷,而是使用黑箱復(fù)用禾蚕,即對(duì)象組合。因?yàn)槔^承的層次增多狂丝,造成最直接的后果就是當(dāng)你調(diào)用這個(gè)類群中某一類换淆,就必須把他們?nèi)考虞d到棧中!后果可想而知.(結(jié)合堆棧原理理解)几颜。同時(shí)倍试,有心的朋友可以留意到微軟在構(gòu)建一個(gè)類時(shí),很多時(shí)候用到了對(duì)象組合的方法蛋哭。比如asp.net中县习,Page類,有Server Request等屬性,但其實(shí)他們都是某個(gè)類的對(duì)象躁愿。使用Page類的這個(gè)對(duì)象來(lái)調(diào)用另外的類的方法和屬性哈蝇,這個(gè)是非常基本的一個(gè)設(shè)計(jì)原則攘已。
如果抽象類實(shí)現(xiàn)接口炮赦,則可以把接口中方法映射到抽象類中作為抽象方法而不必實(shí)現(xiàn),而在抽象類的子類中實(shí)現(xiàn)接口中方法.
IOC 控制反轉(zhuǎn)
控制反轉(zhuǎn)(Inversion of Control样勃,英文縮寫為IoC)把創(chuàng)建對(duì)象的權(quán)利交給框架 ,是框架的重要特征吠勘,并非面向?qū)ο缶幊痰膶S眯g(shù)語(yǔ)。它包括依賴注入(Dependency Injection峡眶,簡(jiǎn)稱DI)和依賴查找(Dependency Lookup)
例子
WPF 中的MEF框架
class Program
{
[Import("MusicBook")]
public IBookService Service { get; set; }
static void Main(string[] args)
{
Program pro = new Program();
pro.Compose();
if (pro.Service != null)
{
Console.WriteLine(pro.Service.GetBookName());
}
Console.Read();
}
//宿主MEF并組合部件
private void Compose()
{
//獲取包含當(dāng)前執(zhí)行的代碼的程序集
var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
CompositionContainer container = new CompositionContainer(catalog);
//將部件(part)和宿主程序添加到組合容器
container.ComposeParts(this);
}
}
}
////Export(typeof(IBookService)) 這句話將類聲明導(dǎo)出為IBookService接口類型
//[Export(typeof(IBookService))]
[Export("MusicBook",typeof(IBookService))]
class MusicBook:IBookService
{
public string BookName { get; set; }
public string GetBookName()
{
return "音樂(lè)書本";
}
}
SOLID
單一職責(zé)原則(SRP)
開放封閉原則(OCP)
里氏替換原則(LSP)
接口隔離原則(ISP)
依賴倒置原則(DIP)
單例模式
/// <summary>
/// 單例模式3:線程安全(建議用這種方式)
/// </summary>
public class Singleton
{
private static Singleton _instance = null;
private static readonly object _instanceLock = new object();
private Singleton() { }
public static Singleton Instance
{
get
{
if (null == _instance)
{
lock (_instanceLock)
{
if (null == _instance)
{
_instance = new Singleton();
}
}
}
return _instance;
}
}
}
優(yōu)點(diǎn)
系統(tǒng)內(nèi)存中該類只存在一個(gè)對(duì)象剧防,節(jié)省了系統(tǒng)資源,對(duì)于一些需要頻繁創(chuàng)建銷毀的對(duì)象辫樱,使用單例模式可以提高系統(tǒng)性能峭拘。
缺點(diǎn)
當(dāng)想實(shí)例化一個(gè)單例類的時(shí)候,必須要記住使用相應(yīng)的獲取對(duì)象的方法狮暑,而不是使用new鸡挠,可能會(huì)給其他開發(fā)人員造成困擾,特別是看不到源碼的時(shí)候搬男。
適用場(chǎng)合
需要頻繁的進(jìn)行創(chuàng)建和銷毀的對(duì)象拣展;
創(chuàng)建對(duì)象時(shí)耗時(shí)過(guò)多或耗費(fèi)資源過(guò)多,但又經(jīng)常用到的對(duì)象缔逛;
工具類對(duì)象备埃;
頻繁訪問(wèn)數(shù)據(jù)庫(kù)或文件的對(duì)象。
Async/Await
async Task<int> AccessTheWebAsync()
{
HttpClient client = new HttpClient();
Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
DoIndependentWork();
string urlContents = await getStringTask;
return urlContents.Length;
}
private void DoIndependentWork()
{
//throw new NotImplementedException();
}
- 調(diào)用異步方法AccesstheWebAsync
- 創(chuàng)建HttpClient實(shí)例褐奴,并使用HttpClient獲取異步數(shù)據(jù)按脚。
- 利用Task執(zhí)行獲取數(shù)據(jù)方法(假設(shè)獲取數(shù)據(jù)需要很長(zhǎng)時(shí)間),不阻塞當(dāng)前線程敦冬,getStringTask代表進(jìn)行中的任務(wù)辅搬。
- 因?yàn)間etStringTask還沒(méi)有使用await 關(guān)鍵字,使之可以繼續(xù)執(zhí)行不依賴于其返回結(jié)果的其他任務(wù)匪补,同步執(zhí)行DoIndependentWork伞辛。
- 當(dāng)同步任務(wù)DoIndependentWork執(zhí)行完畢之后烂翰,返回調(diào)用給AccessTheWebAsync線程夯缺。
- 使用await強(qiáng)制等待getStringTask完成,并獲取基于Task<String>類型的返回值甘耿。(如果getStringTask在同步方法DoIndependentWork執(zhí)行之前完成踊兜,調(diào)用會(huì)返回給AccessTheWebAsync線程,調(diào)用await將會(huì)執(zhí)行不必要的掛起操作)
當(dāng)獲取web數(shù)據(jù)之后佳恬,返回結(jié)果記錄在Task中并返回給await調(diào)用處(當(dāng)然捏境,返回值并沒(méi)有在第二行返回)于游。
獲取數(shù)據(jù)并返回計(jì)算結(jié)果。
結(jié)論:
- Await使用異步IO線程來(lái)執(zhí)行垫言,異步操作的任務(wù)贰剥,釋放工作線程回線程池。
- 線程池分為工作線程和異步IO線程筷频,分別執(zhí)行不同級(jí)別的任務(wù)蚌成。
- 使用Await來(lái)執(zhí)行異步操作效率并不總是高于同步操作,需要根據(jù)異步執(zhí)行長(zhǎng)短來(lái)判斷凛捏。
- 當(dāng)工作線程和IO線程相互切換時(shí)担忧,會(huì)有一定性能消耗。
Thread, Task, Async/Await, Parallel, IAsyncResult
線程同步的方式
volatile
volatile是最簡(jiǎn)單的一種同步方法坯癣,當(dāng)然簡(jiǎn)單是要付出代價(jià)的瓶盛。它只能在變量一級(jí)做同步,volatile的含義就是告訴處理器示罗, 不要將我放入工作內(nèi)存惩猫, 請(qǐng)直接在主存操作我。(【轉(zhuǎn)自www.bitsCN.com 】)因此蚜点,當(dāng)多線程同時(shí)訪問(wèn)該變量時(shí)帆锋,都將直接操作主存,從本質(zhì)上做到了變量共享
但volatile并不能實(shí)現(xiàn)真正的同步禽额,因?yàn)樗牟僮骷?jí)別只停留在變量級(jí)別锯厢,而不是原子級(jí)別。如果是在單處理器系統(tǒng)中脯倒,是沒(méi)有任何問(wèn)題的实辑,變量在主存中沒(méi)有機(jī)會(huì)被其他人修改,因?yàn)橹挥幸粋€(gè)處理器藻丢,這就叫作processor Self-Consistency剪撬。但在多處理器系統(tǒng)中,可能就會(huì)有問(wèn)題悠反。 每個(gè)處理器都有自己的data cach残黑,而且被更新的數(shù)據(jù)也不一定會(huì)立即寫回到主存。所以可能會(huì)造成不同步斋否,但這種情況很難發(fā)生梨水,因?yàn)閏ach的讀寫速度相當(dāng)快,flush的頻率也相當(dāng)高茵臭,只有在壓力測(cè)試的時(shí)候才有可能發(fā)生疫诽,而且?guī)茁史浅7浅P?/p>
lock
System.Threading.Interlocked
Monitor
Mutex
ReaderWriterLock
Web API
什么是
強(qiáng)調(diào)兩個(gè)關(guān)鍵點(diǎn),即可以對(duì)接各種客戶端(瀏覽器,移動(dòng)設(shè)備)奇徒,構(gòu)建http服務(wù)的框架
Web API在ASP.NET完整框架中地位如下圖雏亚,與SignalR一起同為構(gòu)建Service的框架。Web API負(fù)責(zé)構(gòu)建http常規(guī)服務(wù)摩钙,而SingalR主要負(fù)責(zé)的是構(gòu)建實(shí)時(shí)服務(wù)罢低,例如股票,聊天室胖笛,在線游戲等實(shí)時(shí)性要求比較高的服務(wù)
為什么需要 Web API
Web API最重要的是可以構(gòu)建面向各種客戶端的服務(wù)奕短。另外與WCF REST Service不同在于,Web API利用Http協(xié)議的各個(gè)方面來(lái)表達(dá)服務(wù)(例如 URI/request response header/caching/versioning/content format)匀钧,因此就省掉很多配置翎碑。
當(dāng)你遇到以下這些情況的時(shí)候,就可以考慮使用Web API了之斯。
- 需要Web Service但是不需要SOAP
- 需要在已有的WCF服務(wù)基礎(chǔ)上建立non-soap-based http服務(wù)
- 只想發(fā)布一些簡(jiǎn)單的Http服務(wù)日杈,不想使用相對(duì)復(fù)雜的WCF配置
- 發(fā)布的服務(wù)可能會(huì)被帶寬受限的設(shè)備訪問(wèn)
- 希望使用開源框架,關(guān)鍵時(shí)候可以自己調(diào)試或者自定義一下框架
主要功能
Web API的主要功能
-
支持基于Http verb (GET, POST, PUT, DELETE)的CRUD (create, retrieve, update, delete)操作
通過(guò)不同的http動(dòng)作表達(dá)不同的含義佑刷,這樣就不需要暴露多個(gè)API來(lái)支持這些基本操作莉擒。
請(qǐng)求的回復(fù)通過(guò)Http Status Code表達(dá)不同含義,并且客戶端可以通過(guò)Accept header來(lái)與服務(wù)器協(xié)商格式瘫絮,例如你希望服務(wù)器返回JSON格式還是XML格式涨冀。
請(qǐng)求的回復(fù)格式支持 JSON,XML麦萤,并且可以擴(kuò)展添加其他格式鹿鳖。
原生支持OData。
支持Self-host或者IIS host壮莹。
支持大多數(shù)MVC功能翅帜,例如Routing/Controller/Action Result/Filter/Model Builder/IOC Container/Dependency Injection
Web API vs WCF
發(fā)布服務(wù)在Web API和WCF之間該如何取舍呢?這里提供些簡(jiǎn)單地判斷規(guī)則命满,
- 如果服務(wù)需要支持One Way Messaging/Message Queue/Duplex Communication涝滴,選擇WCF
- 如果服務(wù)需要在TCP/Named Pipes/UDP (wcf 4.5),選擇WCF
- 如果服務(wù)需要在http協(xié)議上胶台,并且希望利用http協(xié)議的各種功能歼疮,選擇Web API
- 如果服務(wù)需要被各種客戶端(特別是移動(dòng)客戶端)調(diào)用,選擇Web API
RESTful
什么是RESTful架構(gòu)
1. 每一個(gè)URI代表一種資源诈唬;
2. 客戶端和服務(wù)器之間韩脏,傳遞這種資源的某種表現(xiàn)層;
3. 客戶端通過(guò)四個(gè)HTTP動(dòng)詞讯榕,對(duì)服務(wù)器端資源進(jìn)行操作骤素,實(shí)現(xiàn)"表現(xiàn)層狀態(tài)轉(zhuǎn)化"匙睹。
線程和進(jìn)程的區(qū)別
線程是資源調(diào)度的最小單位愚屁,進(jìn)程是cpu調(diào)度的最小單位济竹,線程包含多個(gè)進(jìn)程,他們共享進(jìn)程的資源
進(jìn)程創(chuàng)建和切換開銷大霎槐,而線程小
聚簇索引和非聚餐索引
聚集索引
表數(shù)據(jù)按照索引的順序來(lái)存儲(chǔ)的送浊,也就是說(shuō)索引項(xiàng)的順序與表中記錄的物理順序一致。對(duì)于聚集索引丘跌,葉子結(jié)點(diǎn)即存儲(chǔ)了真實(shí)的數(shù)據(jù)行袭景,不再有另外單獨(dú)的數(shù)據(jù)頁(yè)。 在一張表上最多只能創(chuàng)建一個(gè)聚集索引闭树,因?yàn)檎鎸?shí)數(shù)據(jù)的物理順序只能有一種耸棒。
非聚集索引
表數(shù)據(jù)存儲(chǔ)順序與索引順序無(wú)關(guān)。對(duì)于非聚集索引报辱,葉結(jié)點(diǎn)包含索引字段值及指向數(shù)據(jù)頁(yè)數(shù)據(jù)行的邏輯指針与殃,其行數(shù)量與數(shù)據(jù)表行數(shù)據(jù)量一致。