พวกเขามีความคล้ายกันมากกรณีการใช้งานเป็นผู้ดูแลนำสำหรับโครงการ ServiceStackฉันมีความเข้าใจที่ดีในข้อดี ServiceStack ของและผลประโยชน์ทางธรรมชาติหลายของการออกแบบข้อความตามมัน
ServiceStack มีมาตั้งแต่ปี 2008 ในฐานะโครงการที่ดำเนินการโดย OSS ตั้งแต่เริ่มก่อตั้งโดยมีเป้าหมายเดียวในการส่งเสริมการออกแบบที่ถูกต้องและการนำไปใช้งานของบริการระยะไกลที่ปราศจากแรงเสียดทาน
การออกแบบที่เรียบง่ายและสง่างาม
ในการแสวงหาความเรียบง่ายขั้นสุดยอดมันสร้างขึ้นจากแกนกลางที่เรียบง่ายและสง่างาม - ด้วยคุณสมบัติส่วนใหญ่ที่มีผลผูกพันกับรุ่นของคุณไม่ใช่ตัวควบคุมของคุณ - ซึ่งเป็นสิ่งที่ MVC, WebApi ทำ (เช่นเดียวกับ )
การนำข้อความตามข้อเสนอการออกแบบวิธีการที่เหนือกว่าสำหรับการให้บริการระยะไกลในการที่พวกเขาส่งเสริมการบริการขยายมากขึ้นและเปราะน้อยลงช่วยลดความยุ่งยากในการเข้าถึงและเรียกรูปแบบและมีประโยชน์จากธรรมชาติอื่น ๆ อีกมากมายที่คุณได้รับฟรี
ในฐานะที่เป็นภารกิจหลักเราต่อสู้กับความซับซ้อนในทุกขั้นตอนโดยมีเป้าหมายเพื่อรักษา API ที่มองไม่เห็นและไม่ล่วงล้ำและหลีกเลี่ยงการแนะนำแนวคิดใหม่หรือสิ่งประดิษฐ์ที่ไม่คุ้นเคยกับ. NET หรือนักพัฒนาบริการเว็บในปัจจุบัน
ตัวอย่างIService<T>
การใช้งานบริการของคุณเป็นเพียงคลาส C # มาตรฐานที่มีการเชื่อมต่อแบบใช้สายอัตโนมัติ บางและน้ำหนักเบาห่อถูกนำมาใช้เพื่อให้สอดคล้องและ API แบบครบวงจรรอบแกนเวลาทำงานIHttpRequestและIHttpResponseประเภท นอกจากนี้ยังอนุญาตให้เข้าถึงคลาส ASP.NET หรือ HttpListener ของคำขอและการตอบกลับเพื่อให้คุณไม่ถูก จำกัด เมื่อใช้ ServiceStack
ตัดกับ WCF และ WebApi
นี่คือภาพรวมคร่าวๆของรูปแบบ API ตัดกันที่ServiceStack และ WCF ส่งเสริม WebApi นั้นแตกต่างจาก WCF เนื่องจากมันสนับสนุนการออกแบบ REST-ful API ในฐานะที่เป็นตัวอย่างระหว่าง 2 นี้เป็นตัวอย่างที่รู้จักกันเท่านั้นที่ฉันมีกับบริการเดียวกันที่เขียนทั้งในServiceStack และ WebAPI
วิธีปฏิบัติที่ดีที่สุดสำหรับบริการระยะไกล
ServiceStack มุ่งเน้นไปที่ความเรียบง่ายประสิทธิภาพและในการส่งเสริมการปฏิบัติที่ดีที่สุดสำหรับบริการเว็บ / ระยะไกลซึ่งมีศูนย์กลางอยู่ที่การโอบกอดมาร์ตินฟาวเลอร์รูปแบบการออกแบบบริการระยะไกลในรูปแบบสำนวน C #:
The Facade Pattern - ซึ่งแนะนำให้ใช้อินเตอร์เฟซแบบหยาบและหยาบเป็นชุดเมื่อคุณสื่อสารข้ามขอบเขตกระบวนการ
DTO รูปแบบ ( MSDN ) - เล่าการใช้ POCOs วัตถุประสงค์พิเศษในการสร้างรูปแบบลวดของการตอบสนองบริการเว็บของคุณ
แบบเกตเวย์ ( MSDN ) เพื่อการสื่อสารในแค็ปซูไคลเอ็นต์และเซิร์ฟเวอร์ของคุณระหว่างรูปแบบไคลเอ็นต์เกตเวย์ / DTO และชั้นบริการอินเตอร์เฟซ
รูปแบบเหล่านี้ช่วยให้มั่นใจได้ว่ามีการแยกความกังวลและประสบการณ์การทำซ้ำแบบไม่มีแรงเสียดทาน
เพิ่มขีดความสามารถการบริการของคุณ
ServiceStack บริการเว็บที่เป็นแกนหลักอยู่กึ่งกลางIService<T>
อินเตอร์เฟสC # ที่ปราศจากการพึ่งพาและอัตโนมัติแบบใช้สายโดยอัตโนมัติซึ่งให้อิสระอย่างสมบูรณ์ในการกำหนดสัญญาบริการเว็บของคุณด้วยคำขอและการตอบสนอง DTO ของคุณเองโดยใช้ POCOs ที่สะอาด - บุกรุกนั่นคือการดึงตรรกะบริการ C # ของคุณออกมาเล็กน้อยและเรียกใช้นอกโฮสต์ ServiceStack
สรุปสาระสำคัญนี้เป็นตัวอย่างที่ดีของสิ่งที่คุณจะได้รับเพียง 1 C # .cs class ใน ServiceStack :
- หน้าข้อมูลเมตาสำหรับรูปแบบที่ลงทะเบียนทั้งหมด
- ด้วยลิงก์ไปยังตัวอย่าง WSDL, XSDs และ C #
- มุมมองรายงาน HTML ที่เป็นมิตรกับมนุษย์
- สแน็ปช็อตหน้า html ที่มีอยู่ในตัวเดียว (เช่นไม่มีการอ้างอิงภายนอก) รวมการตอบสนองบริการเว็บ JSON แบบฝังตัว - อนุญาตให้เข้าถึงสแน็ปช็อตข้อมูลโดยทางโปรแกรม
- Mini Profiler ในตัว (พอร์ตของMVC Mini Profilerยอดเยี่ยม)
- จุดสิ้นสุด JSON / JSONP, XML, JSV, CSV และ SOAP
คลาส RestServiceBase และ ServiceBase มีวัตถุประสงค์เพื่อโฮสต์ตรรกะ C # แบบกำหนดเองของคุณสำหรับการใช้งานที่เป็นไปได้สูงสุดเช่นการออกแบบครั้งแรกของ DTO ช่วยให้สามารถดำเนินการรอการตัดบัญชีและพร็อกซีที่โฮสต์ CQ เดียวกันของคุณ ซึ่งเป็นสิ่งที่เกิดขึ้นเมื่อคุณลงทะเบียนIMessageService
เช่นโฮสต์ RedisMQและเรียกใช้บริการของคุณผ่าน/asynconeway
ปลายทาง (เช่นclient.SendOneWay()
ใน C ลูกค้า #)
คุณสามารถมอบหมายและสร้างบริการคอมโพสิตได้อย่างง่ายดายโดยใช้base.ResolveService<T>()
วิธีที่ส่งกลับอินสแตนซ์แบบใช้สายอัตโนมัติของบริการที่เลือกตามที่เห็นในตัวอย่างบริการลูกค้าของ Nortwind :
var ordersService = base.ResolveService<OrdersService>();
var ordersResponse = (OrdersResponse)ordersService.Get(
new Orders { CustomerId = customer.Id });
ส่งคืนวัตถุ C # ธรรมดา
สำหรับ ServiceStack ส่วนใหญ่จะทำให้วัตถุ C # เป็นส่วนใหญ่ตามที่คาดไว้นี่คือรายการของชนิดส่งคืนที่เป็นไปได้ ( จากคำตอบนี้ ):
- วัตถุ DTO ใด ๆ -> ต่อเนื่องเป็น Response ContentType
- HttpResult, HttpError, CompressedResult (IHttpResult) สำหรับการตอบสนอง HTTP ที่กำหนดเอง
ชนิดต่อไปนี้ไม่ถูกแปลงและเขียนโดยตรงไปยังสตรีมการตอบสนอง:
- เชือก
- กระแส
- IStreamWriter
- ไบต์ [] - ด้วยประเภทเนื้อหาแอปพลิเคชัน / octet-stream
ตัวอย่างของการสนับสนุนส่วนหัว Custom HTTP สามารถเห็นได้โดยตัวอย่าง CORS นี้ซึ่งคุณสามารถกำหนดค่า HTTP Headers ทั่วโลกหรือบนพื้นฐานต่อการบริการ
รองรับ HTML
มีหลายตัวเลือกสำหรับการกลับมา HTML ใน ServiceStack ที่มีการอธิบายในรายละเอียดที่นี่
รวมถึงข้อความที่เร็วที่สุดและเลขลำดับไบนารีสำหรับ. NET
serializers ยืดหยุ่นและรวดเร็วมีความสำคัญหลักในการ API เพื่อให้แน่ใจว่าเวลาการตอบสนองอย่างรวดเร็วและ API ที่ versionable ซึ่งไม่ทำลายลูกค้าที่มีอยู่ซึ่งเป็นเหตุผลที่ ServiceStack รวมถึงserializers ข้อความที่เร็วที่สุดสำหรับ NETกับตัวเลือก NuGet เพื่อเปิดใช้งาน@marcgravell 's พิธีสาร บัฟเฟอร์ ( เลขลำดับไบนารีที่เร็วที่สุดของ. NET)
ServiceStack ของข้อความซีเรียลไลเซอร์มีความยืดหยุ่นสูงและสามารถทนต่อเวอร์ชันขั้นสูงได้โดยไม่มีข้อผิดพลาด
ประสบการณ์การพัฒนาที่ปราศจากแรงเสียดทานแบบ End-to-End
ลักษณะการให้ความเห็นของ ServiceStack ช่วยให้การบริการ API ของเว็บอย่างรวดเร็วพิมพ์อย่างย่อพร้อมจบด้วยการสนับสนุนในตัวสำหรับการซิงค์ / Async C # /. NETและAsync Silverlight ไคลเอ็นต์โดยไม่ต้องใช้รหัสใด ๆ :
ซิงค์ตัวอย่าง C #
var response = client.Send<HelloResponse>(new Hello { Name = "World!" });
ตัวอย่าง Async C #
client.SendAsync<HelloResponse>(new Hello { Name = "World!" },
r => Console.WriteLine(r.Result), (r, ex) => { throw ex; });
เนื่องจากเพิ่งส่งคืน JSON ที่แท้จริงจึงมีการใช้กับไคลเอนต์ HTTP อื่น ๆ เล็กน้อยเช่นตัวอย่างไคลเอ็นต์ JS โดยใช้ jQuery :
$.getJSON("http://localhost/Backbone.Todo/todos", function(todos) {
alert(todos.length == 1);
});
ทดสอบได้สูง
ยี่ห้อ C # /. ServiceClients หุ้นสุทธิอินเตอร์เฟซเดียวกันซึ่งทำให้พวกเขาสูงทดสอบและชนิดถอดเปลี่ยนได้ถึงจุดที่คุณสามารถมีการทดสอบหน่วยเดียวกันยังทำหน้าที่เป็นXML, JSON, JSV บูรณาการทดสอบ
การตรวจสอบและการจัดการข้อผิดพลาดมากมายในตัว
ในภารกิจของตนที่จะมอบประสบการณ์การพัฒนาที่ปราศจาก friciton และสะอาด ServiceStack ยังรวมถึงการตรวจสอบความถูกต้องของการพิมพ์และการจัดการข้อผิดพลาดในตัวโดยการโยน C # Exception หรือใช้การตรวจสอบ Fluent ในตัวเพื่อให้ลูกค้า , เช่น:
try {
var client = new JsonServiceClient(BaseUri);
var response = client.Send<UserResponse>(new User());
} catch (WebServiceException webEx) {
/*
webEx.StatusCode = 400
webEx.ErrorCode = ArgumentNullException
webEx.Message = Value cannot be null. Parameter name: Name
webEx.StackTrace = (your Server Exception StackTrace - if DebugMode is enabled)
webEx.ResponseDto = (your populated Response DTO)
webEx.ResponseStatus = (your populated Response Status DTO)
webEx.GetFieldErrors() = (individual errors for each field if any)
*/
}
เพื่อให้ง่ายต่อการใช้ข้อผิดพลาดใน JavaScript คุณสามารถใช้ไลบรารี่ JavaScript ss-validation.js ที่มีน้ำหนักเบาเพื่อผูกข้อผิดพลาดในการตอบสนองของคุณไปยังเขตข้อมูลฟอร์ม HTML ด้วยรหัสบรรทัดเดียว โครงการตัวอย่าง SocialBootstrapApiยังมีการสาธิตดีของเรื่องนี้
ผสานรวมกับ ASP.NET และ MVC
ServiceStack MVC PowerPackเขียนอีกครั้งและการแก้ไขจำนวนมาก ails ของ ASP.NET และ MVC กับแทนที่มันหมดอำนาจเซสชันและแคช XML ที่กิดขวางให้บริการ ASP.NET กับการดำเนินการทำความสะอาดและการพึ่งพาฟรีของตัวเองของ ICacheClient และ ISession APIs
ServiceStack ยังรวมถึงการรับรองความถูกต้องที่ใหม่กว่าและสะอาดกว่าและรูปแบบการให้บริการอัตโนมัติด้วยจำนวน AuthProviders ที่แตกต่างกันในตัว:
- ข้อมูลรับรอง - สำหรับการตรวจสอบสิทธิ์ด้วยชื่อผู้ใช้ / รหัสผ่านโดยการโพสต์ไปที่บริการ / รับรองความถูกต้อง / ข้อมูลประจำตัว
- การรับรองความถูกต้องขั้นพื้นฐาน - การอนุญาตให้ผู้ใช้รับรองความถูกต้องกับการรับรองความถูกต้องเบื้องต้น
- Twitter OAuth - อนุญาตให้ผู้ใช้ลงทะเบียนและรับรองความถูกต้องกับ Twitter
- Facebook OAuth - อนุญาตให้ผู้ใช้ลงทะเบียนและรับรองความถูกต้องกับ Facebook
โมดูลการรับรองความถูกต้องเป็นตัวเลือกทั้งหมดและมีอยู่แล้วภายในสะอาด ICacheClient / ISession APIs และ OrmLite ซึ่งช่วยให้การประชุมของคุณจะถูกเก็บไว้ในหน่วยความจำ, Redis หรือ Memcached และข้อมูล UserAuth ของคุณยืนยันใน RDBMS ของ SQLServer, MySql, PostgreSQL เช่นเดียวกับ Redis data-store หรือ InMemory (มีประโยชน์สำหรับการพัฒนา / ทดสอบ)
เอกสารยอดเยี่ยม
ServiceStack เป็นเอกสารที่ดีมากที่มากที่สุดของข้อมูลเกี่ยวกับกรอบการทำงานจะเป็นเจ้าภาพในวิกิพีเดีย GitHub เอกสารสำหรับส่วนอื่น ๆ ของกรอบงาน (เช่น Serializers, Redis, OrmLite) สามารถดูได้ที่servicestack.net/docs/
ServiceStack.Examplesโครงการให้รหัสที่มาสำหรับทุกการสาธิตสด ServiceStack และแม่แบบเริ่มต้นในขณะที่โครงการ SocialBoostsrapApiให้เป็นจุดเริ่มต้นที่ดีของการพัฒนา Backbone.js หน้าเดียวกับ App ServiceStack และ MVC ขึ้นอยู่กับเงินทุน Twitters แม่แบบ
นอกเหนือจากที่กล่าวมาข้างต้นขุมทรัพย์ของข้อมูลยังอยู่ใน Google Groupซึ่งขยายตัวค่อนข้างมากในช่วงไม่กี่ปีที่ผ่านมา
วิ่งได้ทุกที่
ServiceStack เป็น. NET 3.5 framework ที่ทำงานบนโฮสต์ ASP.NET และ HttpListener และสามารถโฮสต์บน. NET หรือ Mono (trivia: www.servicestack.netนั้นใช้พลังงานจาก CentOS / Mono) สิ่งนี้ช่วยให้ ServiceStack เว็บเซอร์วิสของคุณโฮสต์บน:
Windows ที่มี. NET 3.5 และ 4.0
Linux / OSX พร้อม Mono
- Apache + mod_mono
- Nginx + MonoFastCGI
- XSP
- แอปคอนโซล
พัฒนาด้วยรูปแบบการพัฒนาโอเพ่นซอร์ส
ServiceStack เป็นผู้เชื่อที่แข็งแกร่งของรูปแบบการพัฒนาโอเพ่นซอร์สที่ได้รับการพัฒนาอย่างแข็งขันในการเปิดและได้รับการโฮสต์ภายใต้ใบอนุญาต OSS เสรี (BSD ใหม่) ตั้งแต่เริ่มก่อตั้ง ณ วันนี้มันจะได้รับเงินอุดหนุนจากมากกว่า47 นักพัฒนาและมันกำลังยืนอยู่ที่โครงการ 3 จับตามองมากที่สุด C # บน GitHub
ข้อเสีย
ฉันเชื่อว่าข้อเสียที่ใหญ่ที่สุดจะเหมือนกันสำหรับโครงการ OSS .NET อื่น ๆ ส่วนใหญ่ที่ไม่ได้พัฒนา (หรือแม้กระทั่งระบุว่าเป็นตัวเลือกที่มีอยู่) โดย Microsoft ซึ่งหมายความว่ามันเป็นตัวเลือกแรกที่ไม่ค่อยได้ประเมินกรอบ ผู้ใช้ส่วนใหญ่จะประเมิน ServiceStack เป็นทางเลือกสุดท้ายซึ่งพวกเขาจะผิดหวังกับความเสียดทานและความเปราะบางของ WCF หรือประสิทธิภาพของ Microsoft Stack ที่ต้องการ
ข้อเสนอแนะและทรัพยากรชุมชน
ServiceStack ได้รับการตอบรับเป็นอย่างดีกับข้อเสนอแนะในเชิงบวกให้โดยคนส่วนใหญ่ที่มีการประเมินว่ามันเป็นที่มองเห็นได้จากความเชื่อมั่นในเชิงบวกในกลุ่มทางไปรษณีย์ ขณะที่ในปีนี้@ServiceStackบัญชี Twitter ได้รับการติดตามการกล่าวถึงและข้อเสนอแนะในรายการโปรดของมัน
ทรัพยากรชุมชนหน้าวิกิพีเดียเป็นสถานที่ที่ดีที่จะหาข้อมูลเพิ่มเติมเกี่ยวกับ ServiceStack ในป่าด้วยการเชื่อมโยงไปยังบล็อกโพสต์, pod casts นำเสนอจิสต์และอื่น ๆ