กรอบการทำงานหน่วยและพื้นที่เก็บข้อมูล | URF อย่างเป็นทางการ หน่วยงานที่ติดตามได้ และทีมโรงงานออกแบบ
URF.Core มีคุณสมบัติครบถ้วน และตอนนี้มีความเท่าเทียมกันอย่างสมบูรณ์กับ URF.NET (.NET ดั้งเดิม) URF.Core ได้ผ่านการเขียนใหม่ทั้งหมดโดยเน้นไปที่สถาปัตยกรรม การออกแบบ และการนำไปใช้งาน รวมถึงการดำเนินการตามคำขอระดับสูงสุดสำหรับ vNext คุณสามารถดู URF.Core.Sample ของเราพร้อม ASP.NET Core Web API, OData, พร้อมตัวอย่าง CRUD เต็มรูปแบบพร้อม Angular และ Kendo UI
ในเวอร์ชัน 3.1.1 มีการเพิ่มการรองรับสำหรับฐานข้อมูลเอกสาร NoSQL พร้อมการใช้งานสำหรับ MongoDb
มีการจัดเตรียมตัวอย่างสำหรับ EF Core 3.x และ MongoDb
ยึดมั่นใน (ดั้งเดิม) URF.NET ของการมีขนาดเล็ก URF.Core URF.Core ( ทั้งหมด 7 คลาส ) กับ URF.NET ( ทั้งหมด 12 คลาส )
เราได้ทำให้การใช้งานทุกอย่างเป็นแบบเสมือน ดังนั้นจึงสามารถเอาชนะได้สำหรับทีม/โครงการ/กรณีการใช้งานของนักพัฒนา รวมถึงกรณี Edge
เช่นเคย นี่เป็นการถกเถียงทางศาสนาระหว่างทีมและภายในชุมชน เช่นเดียวกับ URF.NET (ดั้งเดิม) เราให้ทางเลือกแก่ทีมในการเลือก IQueryable หรือ IEnumerable และแม้แต่ทั้งสองอย่างขึ้นอยู่กับสถาปัตยกรรม การออกแบบและการนำไปใช้งาน และสไตล์ของทีมของคุณ เนื่องจาก URF.NET และสำหรับทีมที่รู้สึกว่ารูปแบบพื้นที่เก็บข้อมูลที่เปิดเผย IQueryable
ว่าเป็นนามธรรมที่รั่วไหล ให้ใช้ IQuery
API ของ URF อย่างง่าย ซึ่งจะให้คุณสมบัติ Fluent ทั้งหมดของ IQueryable แก่คุณ อย่างไรก็ตาม จะส่งกลับ Entity หรือ IEnumerable ล้วนๆ เทียบกับการใช้ IQueryable อีกครั้ง URF รองรับทั้ง .Core และ URF.NET ดังนั้นทีมจึงมีอิสระอย่างเต็มที่ในการเลือกเส้นทาง/ตัวเลือก 3 เส้นทางที่เหมาะสมที่สุดสำหรับทีม/โครงการของตน
public class ProductsController : ODataController
{
private readonly IProductService _productService ;
private readonly IUnitOfWork _unitOfWork ;
public ProductsController (
IProductService productService ,
IUnitOfWork unitOfWork )
{
_productService = productService ;
_unitOfWork = unitOfWork ;
}
// e.g. GET odata/Products?$skip=2&$top=10
[ EnableQuery ]
public IQueryable < Products > Get ( ) => _productService . Queryable ( ) ;
// e.g. GET odata/Products(37)
public async Task < IActionResult > Get ( [ FromODataUri ] int key )
{
if ( ! ModelState . IsValid )
return BadRequest ( ModelState ) ;
var product = await _productService . FindAsync ( key ) ;
if ( product == null )
return NotFound ( ) ;
return Ok ( product ) ;
}
// e.g. PUT odata/Products(37)
public async Task < IActionResult > Put ( [ FromODataUri ] int key , [ FromBody ] Products products )
{
if ( ! ModelState . IsValid )
return BadRequest ( ModelState ) ;
if ( key != products . ProductId )
return BadRequest ( ) ;
_productService . Update ( products ) ;
try
{
await _unitOfWork . SaveChangesAsync ( ) ;
}
catch ( DbUpdateConcurrencyException )
{
if ( ! await _productService . ExistsAsync ( key ) )
return NotFound ( ) ;
throw ;
}
return NoContent ( ) ;
}
// e.g. PUT odata/Products
public async Task < IActionResult > Post ( [ FromBody ] Products products )
{
if ( ! ModelState . IsValid )
return BadRequest ( ModelState ) ;
_productService . Insert ( products ) ;
await _unitOfWork . SaveChangesAsync ( ) ;
return Created ( products ) ;
}
// e.g. PATCH, MERGE odata/Products(37)
[ AcceptVerbs ( " PATCH " , " MERGE " ) ]
public async Task < IActionResult > Patch ( [ FromODataUri ] int key , [ FromBody ] Delta < Products > product )
{
if ( ! ModelState . IsValid )
return BadRequest ( ModelState ) ;
var entity = await _productService . FindAsync ( key ) ;
if ( entity == null )
return NotFound ( ) ;
product . Patch ( entity ) ;
_productService . Update ( entity ) ;
try
{
await _unitOfWork . SaveChangesAsync ( ) ;
}
catch ( DbUpdateConcurrencyException )
{
if ( ! await _productService . ExistsAsync ( key ) )
return NotFound ( ) ;
throw ;
}
return Updated ( entity ) ;
}
// e.g. DELETE odata/Products(37)
public async Task < IActionResult > Delete ( [ FromODataUri ] int key )
{
if ( ! ModelState . IsValid )
return BadRequest ( ModelState ) ;
var result = await _productService . DeleteAsync ( key ) ;
if ( ! result )
return NotFound ( ) ;
await _unitOfWork . SaveChangesAsync ( ) ;
return StatusCode ( ( int ) HttpStatusCode . NoContent ) ;
}
}
URF.Core ได้รับการเขียนใหม่ทั้งหมด และตอนนี้ทุกอย่าง task
อย่างสมบูรณ์ async
await
ทันทีที่แกะกล่อง ด้วยวิธีนี้ ทีมจะได้รับการจัดการเธรดที่ดีที่สุดโดยอัตโนมัติจากการปรับปรุงประสิทธิภาพแบบอะซิงโครนัส
© 2017 URF.NET สงวนลิขสิทธิ์