ایجاد یک برنامهی Minimal-API جدید در دات نت 8
پروژهای را که در اینجا پیگیری میکنیم، بر اساس قالب استاندارد تولید شدهی توسط دستور dotnet new webapi تکمیل میشود.
ایجاد یک صفحهی Blazor 8x به همراه مسیریابی و دریافت پارامتر
در ادامه قصد داریم که یک کامپوننت جدید را به نام SsrTest.razor در پوشهی جدید Components\Tests ایجاد کرده و برای آن مسیریابی از نوع page@ هم تعریف کنیم. یعنی نهفقط قصد داریم آنرا توسط RazorComponentResult رندر کنیم، بلکه میخواهیم اگر آدرس آنرا در مرورگر هم وارد کردیم، قابل دسترسی باشد.
به همین جهت یک پوشهی جدید را به نام Components در ریشهی پروژهی Web API جاری ایجاد میکنیم، با این محتوا:
برای ایده گرفتن از محتوای مورد نیاز، به «معرفی قالبهای جدید شروع پروژههای Blazor در دات نت 8» قسمت دوم این سری مراجعه کرده و برای مثال قالب سادهترین حالت ممکن را توسط دستور زیر تولید میکنیم (در یک پروژهی مجزا، خارج از پروژهی جاری):
dotnet new blazor --interactivity None
- فایل Imports.razor_ ساده شده برای سهولت کار با فضاهای نام در کامپوننتهای Blazor (فضاهای نامی را که در آن وجود ندارند و مرتبط با پروژهی دوم هستند، حذف میکنیم).
- فایل App.razor، برای تشکیل نقطهی آغازین برنامهی Blazor.
- فایل Routes.razor برای معرفی مسیریابی صفحات Blazor تعریف شده.
- پوشهی Layout برای معرفی فایل MainLayout.razor که در Routes.razor استفاده شدهاست.
و ... یک فایل آزمایشی جدید به نام Components\Tests\SsrTest.razor با محتوای زیر:
@page "/ssr-page/{Data:int}" <PageTitle>An SSR component</PageTitle> <h1>An SSR component rendered by a Minimal-API!</h1> <div> Data: @Data </div> @code { [Parameter] public int Data { get; set; } }
تغییرات مورد نیاز در فایل Program.cs برنامهی Web-API برای فعالسازی رندر سمت سرور Blazor
در ادامه کل تغییرات مورد نیاز جهت اجرای این برنامه را مشاهده میکنید:
var builder = WebApplication.CreateBuilder(args); // ... builder.Services.AddRazorComponents(); // ... // http://localhost:5227/ssr-component?data=2 // or it can be called directly http://localhost:5227/ssr-page/2 app.MapGet("/ssr-component", (int data = 1) => { var parameters = new Dictionary<string, object?> { { nameof(SsrTest.Data), data }, }; return new RazorComponentResult<SsrTest>(parameters); }); app.UseStaticFiles(); app.UseAntiforgery(); app.MapRazorComponents<App>(); app.Run(); // ...
- همین اندازه تغییر در جهت فعالسازی رندر سمت سرور کامپوننتهای Blazor در یک برنامهی ASP.NET Core کفایت میکند. یعنی اضافه شدن:
AddRazorComponents ،UseAntiforgery و MapRazorComponents
- در اینجا نحوهی ارسال پارامترها را به یک RazorComponentResult نیز مشاهده میکنید.
- در حالت فراخوانی از طریق مسیر endpoint (یعنی فراخوانی مسیر http://localhost:5227/ssr-component در مثال فوق)، خود کامپوننت فراخوانی شده، بدون layout تعریف شدهی در فایل App.razor، رندر میشود. علت اینجا است که layout برنامه به همراه کامپوننت Router و RouteView آن فعال میشود که این دو هم مختص به صفحات دارای مسیریابی Blazor هستند و برای رندر کامپوننتهای خالص آن بکار گرفته نمیشوند. خروجی RazorComponentResult تنها یک static SSR خالص است؛ مگر اینکه فایل blazor.web.js را نیز بارگذاری کند.
یک نکته: اگر در حالت رندر توسط RazorComponentResult، علاقمند به استفادهی از layout هستید، میتوان از کامپوننت LayoutView داخل یک کامپوننت فرضی به صورت زیر استفاده کرد؛ اما این مورد هم شامل اطلاعات فایل App.razor نمیشود:
<LayoutView Layout="@typeof(MainLayout)"> <PageTitle>Home</PageTitle> <h2>Welcome to your new app.</h2> </LayoutView>
سؤال: آیا در این حالت کامپوننتهای تعاملی هم کار میکنند؟
پاسخ: بله. فقط برای ایده گرفتن، یک نمونه پروژهی تعاملی Blazor 8x را در ابتدا ایجاد کنید و قسمتهای اضافی AddRazorComponents و MapRazorComponents آنرا در اینجا کپی کنید؛ یعنی برای مثال جهت فعالسازی کامپوننتهای تعاملی Blazor Server، به این دو تغییر زیر نیاز است:
// ... builder.Services.AddRazorComponents() .AddInteractiveServerComponents(); // ... app.MapRazorComponents<App>().AddInteractiveServerRenderMode(); // ...
<script src="_framework/blazor.web.js"></script>
@rendermode InteractiveServer <h1>Counter</h1> <p role="status">Current count: @_currentCount</p> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button> @code { private int _currentCount; private void IncrementCount() { _currentCount++; } }
// http://localhost:5227/server-interactive-component app.MapGet("/server-interactive-component", () => new RazorComponentResult<Counter>());
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Interactive server component</title> <base href="/"/> </head> <body> <h1>Interactive server component</h1> <Counter/> <script src="_framework/blazor.web.js"></script> </body> </html>
سپس تعریف endpoint متناظر را به صورت زیر تغییر میدهیم:
// http://localhost:5227/server-interactive-component app.MapGet("/server-interactive-component", () => new RazorComponentResult<CounterInteractive>());
سؤال: آیا میتوان این خروجی static SSR کامپوننتهای بلیزر را در سرویسهای یک برنامه ASP.NET Core هم دریافت کرد؟
منظور این است که آیا میتوان از یک کامپوننت Blazor، به همراه تمام پیشرفتهای Razor در آن که در Viewهای MVC قابل دسترسی نیستند، بهشکل یک رشتهی خالص، خروجی گرفت و برای مثال از آن بهعنوان قالب پویای محتوای ایمیلها استفاده کرد؟
پاسخ: بله! زیر ساخت RazorComponentResult که از سرویس HtmlRenderer استفاده میکند، بدون نیاز به برپایی یک endpoint هم قابل دسترسی است:
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Web; namespace WebApi8x.Services; public class BlazorStaticRendererService { private readonly HtmlRenderer _htmlRenderer; public BlazorStaticRendererService(HtmlRenderer htmlRenderer) => _htmlRenderer = htmlRenderer; public Task<string> StaticRenderComponentAsync<T>() where T : IComponent => RenderComponentAsync<T>(ParameterView.Empty); public Task<string> StaticRenderComponentAsync<T>(Dictionary<string, object?> dictionary) where T : IComponent => RenderComponentAsync<T>(ParameterView.FromDictionary(dictionary)); private Task<string> RenderComponentAsync<T>(ParameterView parameters) where T : IComponent => _htmlRenderer.Dispatcher.InvokeAsync(async () => { var output = await _htmlRenderer.RenderComponentAsync<T>(parameters); return output.ToHtmlString(); }); }
builder.Services.AddScoped<HtmlRenderer>(); builder.Services.AddScoped<BlazorStaticRendererService>();
app.MapGet("/static-renderer-service-test", async (BlazorStaticRendererService renderer, int data = 1) => { var parameters = new Dictionary<string, object?> { { nameof(SsrTest.Data), data }, }; var html = await renderer.StaticRenderComponentAsync<SsrTest>(parameters); return Results.Content(html, "text/html"); });
کدهای کامل این مطلب را میتوانید از اینجا دریافت کنید: WebApi8x.zip
Stop writing your changelogs manually
How do you usually keep track of the changes in your projects? Do you use GitHub releases? Do you update your changelogs manually? In this article, I will explain how I handle this topic. This is just one way of doing it, feel free to stick around if you are interested in the topic 🔥
Bootstrap 4.4.0 منتشر شد
- New responsive containers! Over a year in the making, fluid up to a particular breakpoint, available for all responsive tiers.
- New responsive
.row-cols
classes for quickly specifying the number of columns across breakpoints. This one is huge for those of you who have asked for responsive card decks.
الگوی Composite
الگوی Composite در عمل یک Collection Pattern (الگوی مجموعه ای) است. که میتوان در درون آن ترکیبی از زیر مجموعههای مختلف را قرار داد و سپس هر زیر مجموعه را به نوبه خود فراخوانی نمود.به بیان دیگر الگوی Composite به ما کمک میکند که در یک ساختار درختی بتوانیم مجموعه ای (Collection ی)،از بخشی از آبجکتهای سلسله مراتبی را نمایش دهیم. این الگو به Client اجازه میدهد، که رفتار یکسانی نسبت به یک Collection ی از آبجکتها یا یک آبجکت تنها داشته باشد.
مثالهای متعددی میتوان از الگوی Composite زد، که در ذیل به چند نمونه از آنها میپردازیم:
نمونه اول: همانطور که میدانیم یک سازمان از بخشهای مختلفی تشکیل شده است، که بصورت سلسله مراتبی با یکدیگر در ارتباط میباشند، چنانچه بخواهیم بخشها و زیر مجموعههای تابعه آنها را بصورت آبجکت نگهداری نماییم، یکی از بهترین الگوهای پیشنهاد شده الگوی Composite میباشد.
نمونه دوم: در بحث حسابداری،یک حساب کل از چندین حساب معین تشکیل شده است و هر حساب معین نیز از چندین سرفصل حسابداری تشکیل میشود. بنابراین برای نگهداری آبجکتهای معین مرتبط به حساب کل، میتوان آنها را در یک Collection قرار داد. و هر حساب معین را میتوان،در صورت داشتن چندین سرفصل در مجموعه خود به عنوان یک Collection در نظر گرفت. برای دسترسی به هر حساب معین و سرفصلهای زیر مجموعه آن نیز میتوان از الگوی Composite استفاده نمود.
نمونه سوم: یک File System را در نظر بگیرید،که ساختارش از File و Folder تشکیل شده است. و میتواند یک ساختار سلسله مراتبی داشته باشد.بطوریکه درون هر Folder میتواند یک یا چند File یا Folder قرار گیرد. و در درون Folderهای زیر مجموعه میتوان چندین File یا Folder دیگر قرار داد.اگر بخواهیم به عنوان نمونه شکل ساختار درختی File و فولدر را نمایش دهیم بصورت زیر خواهد بود:
در ساختار درختی به Folder شاخه یا Branch گویند، چون میتواند زیر شاخههای دیگری نیز در خود داشته باشد. و به File برگ یا Leaf گویند.برگ نمیتواند زیر مجموعه ای داشته باشد. در واقع برگ (Leaf) بیانگر انتهای یک شاخه میباشد.
نمونه آخر:می توان به ساختار منوها در برنامهها اشاره نمود.هر منو میتواند شامل چندین زیر منو باشد. و همان زیر منوها میتوانند از چندین زیر منوی دیگر تشکیل شوند. این ساختار نیز یک ساختار سلسله مراتبی میباشد، و برای نگهداری آبجکتهای یک مجموعه میتوان از الگوی Composite استفاده نمود.
الگوی Composite از سه Component اصلی تشکیل شده است،که یکایک آنها را بررسی میکنیم:
- Component: کلاس پایه ای است که در آن متدها یا Functionalityهای مشترک تعریف میگردد. Component میتواند یک Abstract Class یا Interface باشد.
- Leaf : به آبجکتهای گفته میشود که هیچ Child ی ندارند. و فقط یک آبجکت مستقل تنها میباشد. کلاس Leaf متدهای مشترک تعریف شده در Component را پیاده سازی میکند.اگر مثال File و Folder را بخاطر آورید،File یک آبجکت از نوع Leaf است چون نمیتواند هیچ فرزندی داشته باشد و یک آبجکت تنها میباشد.
- Composite: کلاس فوق Collection ی از آبجکتها را در خود نگهداری میکند، به عبارتی در Composite میتوان بخشی از ساختار درختی را قرار داد، که این ساختار میتواند ترکیبی از آبجکتهای Leaf و Composite باشد. در مثال File و Folder، یک Folder را میتوان به عنوان Composite در نظر گرفت،زیرا که یک Folder میتواند چندین File یا Folder را در خود جای دهد. در کلاس Composite معمولا متدهایی همچون Add (افزودن Remove،( Child (حذف یک Child) و غیرو... وجود دارد.
public interface Icomponent { void Display(int depth); }
public class Leaf:Icomponent { private String name = string.Empty; public Leaf(string name) { this.name = name; } public void Display(int depth) { Console.WriteLine(new String('-', depth) + ' ' + name); } }
public class Composite:Icomponent { private List<Icomponent> _children = new List<Icomponent>(); private String name = String.Empty; public Composite(String sname) { this.name = sname; } public void Add(Icomponent component) { _children.Add(component); } public void Remove(Icomponent component) { _children.Remove(component); } public void Display(int depth) { Console.WriteLine(new String('-', depth) + ' ' + name); // Recursively display child nodes foreach (Icomponent component in _children) { component.Display(depth + 2); } } }
class Program { static void Main(string[] args) { // Create a tree structure Composite root = new Composite("root"); root.Add(new Leaf("Leaf A")); root.Add(new Leaf("Leaf B")); Composite comp = new Composite("Composite X"); comp.Add(new Leaf("Leaf XA")); comp.Add(new Leaf("Leaf XB")); root.Add(comp); root.Add(new Leaf("Leaf C")); // Add and remove a leaf Leaf leaf = new Leaf("Leaf D"); root.Add(leaf); root.Remove(leaf); // Recursively display tree root.Display(1); Console.ReadKey(); } }
1.Visual Studio 2017 15.7 منتشر شد
These are the customer-reported issues addressed in 15.7.1:
- This release includes a fix that reduces memory usage and GC pressure during solution load.
Microsoft Security Advisory for .NET Core Denial Of Service Vulnerability
CVE-2018-0765
Microsoft is releasing this security advisory to provide information about a vulnerability in .NET Core and .NET native version 2.0. This advisory also provides guidance on what developers can do to update their applications to remove this vulnerability.
Microsoft is aware of a denial of service vulnerability that exists when .NET Framework and .NET Core improperly process XML documents. An attacker who successfully exploited this vulnerability could cause a denial of service against a .NET Framework, .NET Core, or .NET native application.
The update addresses the vulnerability by correcting how .NET Framework, .NET Core, and .NET native applications handle XML document processing.
If your application is an ASP.NET Core application, developers are also advised to update to ASP.NET Core 2.0.8.
در این قسمت در ابتدا نحوهی باز کردن یک پایگاه داهی چند بعدی را در محیط BIMS بررسی کرده و سپس چگونگی ساخت یک MDB را از پایه بررسی میکنیم. برای ادامه دادن این قسمت نیاز میباشد که پایگاه دادهی AdventureWorkDW2008 را در SSAS نصب کرده باشید .
در ابتدا مطابق شکل زیر منوی File سپس زیر منوی Open و Analysis Service Database را انتخاب نمایید.
در ادامه میبایست نام Server را مشخص نمایید و دقت داشته باشید که در اینجا منظور از نام سرور، نام سرور SSAS میباشد (در صورتیکه بر روی خود سرور در حال کار میباشید از . به جای نام سرور استفاده کنید). سپس در قسمت Database، نام پایگاه دادهی چند بعدی را انتخاب نمایید. در صورتی که به جز Adventure Work DW 2008 ، پایگاه دادههای چند بعدی دیگری را در SSAS داشته باشید، یک لیست از آنها را مشاهده خواهید کرد و در صورتیکه لیست شما خالی میباشد، احتمال دارد نام سرور اشتباه باشد یا روی سرویس SSAS مربوط به آن سرور هیچ پایگاه دادهی چند بعدی نصب نباشد.
حال مسیری را برای ذخیره سازی پروژهی جدید در نظر بگیرید:
پس از کمی شکیبایی، واکشی اطلاعات از روی پایگاه دادهی چند بعدی انتخاب شده انجام میشود و یک پروژه در ارتباط با آن پایگاه داده ساخته میشود.
همان طور که مشخص میباشد، یک شیء درون شاخهی Data Source وجود دارد که مشخص کنندهی ارتباط این پروژه با پایگاه دادهی Data Warehouse است. برای مشاهدهی این ارتباط، بر روی Adventure Work DW کلیک راست کنید و سپس گزینهی Open را انتخاب نمایید. در ادامه گزینهی Edit را بزنید.
سپس در پنجرهی جدید، تنظیمات رشتهی ارتباطی با DW را مشاهده نمایید
با زدن کلید Test Connection باید پیام Test Connection Succeeded را مشاهده نمایید. اکنون پنجرهها را با زدن کلید OK ببندید.
در قسمت Data Source View سه شی تعریف شده است؛ براساس دسته بندی مورد نظر و جاری در Business موجود در Adventure Work .
با کلیک راست کردن بر روی Adventure Works DW و انتخاب گزینهی Open، اقدام به باز کردن DSV انتخاب شده کنید. در صفحهی باز شده میتوانید انواع دیاگرام تهیه شده را مشاهده نمایید و همچنین لیستی از جداول موجود در این DSV مشخص میباشد.
با کلیک راست کردن در فضای خالی دیاگرام ، امکان Add/Remove کردن جداول را به دیاگرام دارید.
در شکل بالا بعد از انتخاب یک جدول در سمت راست و انتقال آن به سمت چپ میتوانید با زدن دکمهی Add Related Table براساس کلیدهای خارجی، جداول مرتبط با جدول انتخاب شده را به صورت خودکار انتخاب نمایید و به قسمت چپ انتقال دهید.
شما در ساخت Cube مشخص مینمایید که Cube را از کدام DSV خواهید ساخت. بنابراین انتخاب جداول در DSV ها میبایست براساس نوع Business شما باشد تا در ساخت Cube به مشکلی برخورد نکنید.
در ساختار درختی موجود در پنجرهی Solution در شاخهی Cube، میتوانید Adventure Works را باز کنید (کلیک راست و انتخاب Open ) .
در شکل بالا در سمت چپ، میتوانید Measure ها و Dimension های موجود در این Cube را مشاهده کنید. همچنین در قسمت بالا چندین Tab وجود دارند که در هر کدام تنظیمات بیشتری را بر روی Cube اعمال میکنیم. با توجه به اینکه طراحی Cube ها کاری تخصصی میباشد و نیاز به اطلاعات زیادی دارد اجازه دهید مقاله ای در خصوص طراحی Cube در SSAS جداگانه انتشار داده شود و فعلا در همین حد بسنده کنیم. با این حال در صورت نیاز میتوانید برای اطلاعات بیشتر در این خصوص کتاب Microsoft SQL Server Analysis Services 2008 With MDX از انتشارات Wrox را مطالعه نمایید.
در Solution Explorer در شاخهی ،Dimensions میتوانید تمامی بعدهایی که در تمامی Cube های شما استفاده شدهاند را مشاهده نمایید.
با انتخاب یک بعد (ترجیحا بعد Date ) و با کلیک راست کردن و انتخاب گزینهی Open آن را باز نمایید.
در پنجرهی باز شده میتوانید 4 Tab در بالا را مشاهد نمایید و در Tab نخست، Attribute ها و همچنین ساختار Hierarchies و در آخر Data source View را مشاهده نمایید.
در Attribute relationships می توانید ارتباط صفتهای یک بعد را مشخص نمایید.
در Browsing Tab میتوانید محتوای Dimension را بررسی نمایید (البته اگر در پروژهی جدید قرار دارید حتما میبایست پروژه را Deploy کرده باشید. در حالتیکه یک پایگاه داهی چند بعدی را باز میکنید، نیازی به Deploy کردن نمیباشد؛ زیرا حتما قبلا این کار انجام شده است (زیرا شما پایگاه دادهی چند بعدی را بعد از Deploy کردن پروژهی SSAS خواهید داشت ))
در صورتیکه مانند روش بالا یک پایگاه دادهی چند بعدی را باز کنیم، دیگر نیازی به Deploy کردن نمیباشد و فقط برای اعمال تغییرات روی پایگاه دادهی چند بعدی باید پروژه را Process کنیم و برای این منظور روی نام پروژه کلیک راست کرده و گزینهی Process را انتخاب کنید. با این کار تغییرات اعمال شده در BIMS روی پایگاه دادهی SSAS اعمال میگردند و دادهها با توجه به ساختار Cube ها دوباره پردازش میشوند.
برای ساخت یک پروژهی جدید به شکل زیر عمل میکنیم :
در ابتدا BIMS را باز کرده و سپس به منوی File رفته و در قسمت New گزینهی Project را انتخاب میکنیم. سپس در صفحهی باز شده، مطابق شکل زیر عمل کرده و یک پروژه از نوع Analysis Service Multidimensional … میسازیم.
سپس برروی شاخهی Data Source کلیک راست کرده و گزینهی New Data Source را میزنیم و پنجرههای ویزارد را به جلو میرویم.
در ابتدا باید یک Connection به DW تولید کنیم. برای این منظور در پنجرهی فوق دکمهی New را زده و اطلاعات را مطابق شکل زیر پر میکنیم.
و سپس OK را میزنیم.
در صورتی که SSAS در یک سرور دیگر نصب شده است در پنجرهی بعدی نیاز میباشد نام کاربری را که به سرویس SSAS در آن سرور دسترسی دارد را وارد کنیم.
در صورتی که SSAS روی سیستم Local نصب شده است و کاربری که با آن Login هستیم دسترسی کافی به SSAS را دارد، گزینهی Use the credentials of the current user را انتخاب میکنیم.
در صفحهی آخر یک نام برای DS انتخاب میکنیم.
سپس نیاز میباشد یک DSV بسازیم. برای این منظور روی شاخهی Data Source View کلیک راست کرده و گزینهی New را انتخاب کرده و سپس در پنجرهی Wizard باید Data Source ساخته شده در مرحلهی قبل را انتخاب کرده و سپس Next را بزنیم. در اینجا بر اساس بیزینسهای مختلف، راه کارهای گوناگونی را داریم. به عبارت دیگر میتوان جداول Fact و Dimension های مرتبط با آنرا بر اساس زیر سیستمهای مختلف انتخاب کرده و برای هر کدام از آنها یک DSV بسازیم. به نظر من میتوانیم تمامی جداول را در این مرحله انتخاب کرده و سپس این تفکیک بندی را در سطح Cube ها انجام داد. به طور کلی دقت داشته باشید به هیچ عنوان DSV و Cube های سیستم را خیلی تفکیک نکنید. زیرا در نوشتن کوئریها و Join بین Cube ها با مشکل و سختی روبرو خواهید شد. (از لحاظ تجربی تفکیک بندی به شرطی صورت گیرد که نیازی به Join کردن Cube ها در MDX Query ها نباشد.)
سپس یک نام برای DSV خود انتخاب کرده و Finish را بزنید.
خوب؛ آخرین مرحله ساخت Cube میباشد (البته در طراحی Cube مطالب بسیاری وجود دارند که در یک مقالهی دیگر تلاش خواهم کرد تمامی آن موارد را توضیح دهم.)
برای ساخت Cube ، روی شاخهی Cube کلیک راست کرده و گزینهی New را بزنید.
سپس Use Existing Table را انتخاب کرده و Next را بزنید.
در پنجرهی بعدی باید DSV را انتخاب کرد و بعد جداول مورد نیاز در طراحی Cube را انتخاب کنید. فراموش نکنید در صورت انتخاب یک Fact تمامی Dimension های مرتبط با آن را انتخاب نماید. دکمه Next را بزنید.
در پنجرهی بعدی باید جداول Fact را انتخاب کرده و دکمهی Next را بزنید.
سپس در پنجرهی بعدی دایمنشن را انتخاب نمایید. (ترجیحا اجازه بدهید خود BIMS برای شما Dimension ها را بسازد، هرچند که خود شما میتوانید بعدا به صورت دستی Dimension ها را ایجاد کنید).
بعد از زدن دکمهی Next نامی برای Cube خود انتخاب نمایید و سپس دکمهی Finish را بزنید.
بعد از ساخت Cube ، چندین دایمنشن به صورت خودکار ساخته میشوند . البته گاهی نیاز میباشد که اقدام به ساخت ساختارهای سلسله مراتبی در Dimension ها کنیم (این مورد را در یک مقاله جداگانه آموزش خواهم داد.)
پروژه با کلیدهای ترکیبی Ctrl+Shift+B ساخته میشود و بعد از اطمینان از درست بودن ساخت پروژه، آن را باید Deploy کرد.
برای Deploy کردن یک پروژه کافی است بعد از تنظیم کردن رشتهی ارتباطی در DS (قبلا توضیح داده شده است) روی پروژه کلیک راست کرده و گزینهی Deploy را بزنیم.
ارائهی MapKit JS از اپل
Use of the library does involve having an Apple Developer account at $99 a year , and to use the beta, developers will need to set up core Maps identifiers, keys, and tokens via their developer account. The beta version limits usage to 250,000 instantiations and 25,000 service calls, per API key per day, compared to Google's limit of 100,000 map instantiations per month on the free tier.