اشتراکها
Depcheck not only recognizes the dependencies in JavaScript files, but also supports these syntaxes:
- JavaScript (ES5, ES6 and ES7)
- React JSX
- CoffeeScript
- Typescript (with
typescript
dependency) - SASS and SCSS (with
node-sass
dependency) - Vue.js (with
vue-template-compiler
dependency)
اشتراکها
سایتی رسمی TypeScript
اشتراکها
استفاده از React و TypeScript
نظرات مطالب
آموزش TypeScript #1
در مقایسه Coffeescript و Typescript با نگاهی اجمالی به سورس هر دو پروژه در گیت هاب میتوان اضافه کرد که در حال حاضر (2017/06/28) Typescript کامیونیتی بسیار پویاتر (برای مثال آخرین کامیت در تایپ اسکریپت چند ساعت و دقیقه پیش ، و در کافی اسکریپت چند روز یا چند ماه پیش ثبت شده) ، قدرتمندتر و پر تعدادیتری دارد همچنین پختگی مورد نظر نویسنده بنظر میرسد بعد از گذشت چند سال کاملا حاصل شده باشد .
نظرات مطالب
آموزش TypeScript #1
با نگاهی به زبان TypeScript متوجه میشویم که خیلی Syntax روان و آسانی دارد.
سوالی که همیشه من داشته ام این است .... چرا خود زبان JavaScript را تغییر نمیدهند؟
مسلما TypeScript و CoffeeScript برای برطرف کردن ضعف JavaScript بوجود آمده اند اما چرا خود مشکل را برطرف نمیکنند؟
میتوانستند همانند ارائه HTML5 و CSS3 نسخه جدیدی از JavaScript ارائه کنند که سختیهای کار با JavaScript را برطرف کرده باشند!
سوالی که همیشه من داشته ام این است .... چرا خود زبان JavaScript را تغییر نمیدهند؟
مسلما TypeScript و CoffeeScript برای برطرف کردن ضعف JavaScript بوجود آمده اند اما چرا خود مشکل را برطرف نمیکنند؟
میتوانستند همانند ارائه HTML5 و CSS3 نسخه جدیدی از JavaScript ارائه کنند که سختیهای کار با JavaScript را برطرف کرده باشند!
استفاده از OData تنها به عملیات CRUD معطوف نمیشود و در عمل شما این قابلیت را دارید که متدهای سفارشی و کاملا مجزایی را از همدیگر در سرویسهای خود داشته باشید.
حال نیاز داریم که آن را به EDM اضافه نماییم. در کانفیگ OData، نوع Conventional را استفاده کرده و ابتدا Namespaceی را تعریف کرده و سپس Action خود را تعریف مینماییم؛ به صورت زیر:
در اینجا یک متد اکشن را به نام Rate و پارامتری را از نوع integer به نام Rating تعریف مینماییم.
توجه کنید که نام متد نوشته شده، همنام اکشنی است که قبلا تعریف کردهایم. کار ODataActionParameters گرفتن پارامترهای ارسالی از سمت کلاینت میباشد. دقت کنید که نام پارامتر را نیز تعیین کرده بودیم.
توجه داشته باشید که ProductService همان Nampespaceی است که در کانفیگ تعیین کرده بودیم.
اضافه کردن متد Function
در اینجا یک متد function را به نام MostExpensive، بدون پارامتر و با نوع بازگشتی double، تعریف نمودهایم.
نکته:
و یا نوع بازگشتی، لیستی از EntitySetها باشد:
و یا نوع بازگشتی بطور مثال لیستی از stringها باشد:
برای فراخوانی این متد میتوان از آدرس زیر استفاده نمود:
حال فقط کافیست که متد آن را در کنترلر مربوطه پیاده سازی نماییم:
اگر مقالههای قبلی را دنبال کرده باشید، این قسمت برای شما آشنا خواهد بود.
اضافه کردن Unbound Function
توجه کنید اینجا ما متد را به صورت مستقیم از ODataModelBuilder تهیه نمودهایم؛ به جای Entity type یا collection مربوطه. این تنظیم به model builder میگوید که متدی unbound میباشد.
اهمیتی ندارد که این متد را در چه Controllerی پیاده سازی نمایید. ذکر [ODataRoute] نیز برای تعریف URl این function میباشد.
برای فراخوانی آن نیز از درخواست زیر استفاده مینماییم:
یک مثال از نوع response درخواست فوق
شاید سؤالی برایتان پیش بیاید که آیا برای تعریف هر متد، این همه مراحل کانفیگ لازم است؟! در واقع باید عرض کنم، این نوع استفاده از OData، ابتداییترین نوع طراحی آن میباشد و قطعا در یک برنامهی واقعی این همه کد نویسی برای نوشتن فقط یک متد، شاید منطقی به نظر نمیرسد. از آنجاییکه این مقاله فقط جنبهی آموزشی خیلی ساده از این پروتکل را دارد، فعلا به همین اندازه بسنده میکنیم. اما در مقالههای بعدی راهحلهایی برای بینهایت ساده کردن کانفیگ OData را شرح خواهیم داد.
هرچند در بعضی از سناریوها نیازی به استفادهی بیشتر از CRUD مربوط به آن entity وجود ندارد، اما در اکثر موارد نیاز به رفتاری دارید که به راحتی با استفاده از CRUD معمولی قابلیت پیاده سازی را ندارد. در اینگونه موارد Actionها و Functionها هستند که به راحتی با استفاده از آنها، قابلیت طراحی ماژولهای سفارشی فراهم شده است.
Actions و Functions در عمل رفتاری شبیه به هم را دارند؛ اما تفاوتهای آنها در این است که:
1) Actionها برای درخواستهای از نوع post هستند؛ اما به عکس Functionها از نوع get میباشند.
2) Actionها اثرات جانبی دارند اما Functionها خیر.
3) Functionها حتما باید خروجی داشته باشند؛ اما این الزام برای Actionها وجود ندارد.
4) هر دو امکان داشتن هر تعداد پارامتری را دارند (یا بدون پارامتر).
اضافه کردن Action
فرض کنید مدل زیر را در اختیار داریم
namespace ProductService.Models { public class ProductRating { public int ID { get; set; } public int Rating { get; set; } public int ProductID { get; set; } public virtual Product Product { get; set; } } }
ODataModelBuilder builder = new ODataConventionModelBuilder(); builder.EntitySet<Product>("Products"); builder.Namespace = "ProductService"; builder.EntityType<Product>() .Action("Rate") .Parameter<int>("Rating");
اضافه کردن متد اکشن در کنترلر
[HttpPost] public async Task<IHttpActionResult> Rate([FromODataUri] int key, ODataActionParameters parameters) { if (!ModelState.IsValid) { return BadRequest(); } int rating = (int)parameters["Rating"]; db.Ratings.Add(new ProductRating { ProductID = key, Rating = rating }); await db.SaveChangesAsync(); return StatusCode(HttpStatusCode.NoContent); }
ذکر [HttpPost] برای تعیین کردن post بودن این متد است. برای فراخوانی این اکشن از سمت کلاینت، درخواستی را از نوع post، بدین شکل ارسال مینماییم:
POST http://localhost/Products(1)/ProductService.Rate HTTP/1.1 Content-Type: application/json Content-Length: 12 {"Rating":5}
و البته برای فراخوانی این درخواست توسط یک کلاینت C#ی، اینگونه رفتار میکنیم (در مقالههای آتی از C# Odata client برای فراخوانی درخواستها به صورت strongly typed استفاده خواهیم نمود)
HttpClient client = new HttpClient(); var response = client.PostAsync(postUrl, new StringContent(JsonConvert.SerializeObject(new { Rating = 5 }), Encoding.UTF8, "application/json")).Result;
اضافه کردن متد Function
برای اضافه کردن متد فانکشن نیز ابتدا باید آن را در کانفیگ OData معرفی نماییم؛ به صورت زیر:
ODataModelBuilder builder = new ODataConventionModelBuilder(); builder.EntitySet<Product>("Products"); builder.EntitySet<Supplier>("Suppliers"); builder.Namespace = "ProductService"; builder.EntityType<Product>().Collection .Function("MostExpensive") .Returns<double>();
نکته:
برای اینکه نوع بازگشتی از نوع EntitySet باشد:
ReturnsFromEntitySet<Product>("Products")
ReturnsCollectionFromEntitySet<Product>("Products");
ReturnsCollection<string>();
برای فراخوانی این متد میتوان از آدرس زیر استفاده نمود:
GET http://localhost/Products/ProductService.MostExpensive
حال فقط کافیست که متد آن را در کنترلر مربوطه پیاده سازی نماییم:
public class ProductsController : ODataController { [HttpGet] public IHttpActionResult MostExpensive() { var product = db.Products.Max(x => x.Price); return Ok(product); } // Other controller methods not shown. }
نوع response بازگشتی درخواست فوق چیزی شبیه به این خواهد بود:
HTTP/1.1 200 OK Content-Type: application/json; odata.metadata=minimal; odata.streaming=true OData-Version: 4.0 Date: Sat, 28 Jun 2016 00:44:07 GMT Content-Length: 85 { "@odata.context":"http://localhost:38479/$metadata#Edm.Decimal","value":50.00 }
اضافه کردن Unbound Function
در مثال قبلی یک function bound نوشتیم که مربوط به یک EntitySet خاص بود. اما اکنون میخواهیم یک متد Unbound تعریف نماییم، به صورت زیر:
ODataModelBuilder builder = new ODataConventionModelBuilder(); builder.EntitySet<Product>("Products"); builder.Function("GetSalesTaxRate") .Returns<double>() .Parameter<int>("PostalCode");
متد آن را نیز اینگونه پیاده سازی مینماییم:
[HttpGet] [ODataRoute("GetSalesTaxRate(PostalCode={postalCode})")] public IHttpActionResult GetSalesTaxRate([FromODataUri] int postalCode) { double rate = 5.6; // Use a fake number for the sample. return Ok(rate); }
برای فراخوانی آن نیز از درخواست زیر استفاده مینماییم:
GET http://localhost/GetSalesTaxRate(PostalCode=10) HTTP/1.1
HTTP/1.1 200 OK Content-Type: application/json; odata.metadata=minimal; odata.streaming=true OData-Version: 4.0 Date: Sat, 28 Jun 2016 01:05:32 GMT Content-Length: 82 { "@odata.context":"http://localhost:38479/$metadata#Edm.Double","value":5.6 }
شاید سؤالی برایتان پیش بیاید که آیا برای تعریف هر متد، این همه مراحل کانفیگ لازم است؟! در واقع باید عرض کنم، این نوع استفاده از OData، ابتداییترین نوع طراحی آن میباشد و قطعا در یک برنامهی واقعی این همه کد نویسی برای نوشتن فقط یک متد، شاید منطقی به نظر نمیرسد. از آنجاییکه این مقاله فقط جنبهی آموزشی خیلی ساده از این پروتکل را دارد، فعلا به همین اندازه بسنده میکنیم. اما در مقالههای بعدی راهحلهایی برای بینهایت ساده کردن کانفیگ OData را شرح خواهیم داد.