Понеже има няколко поста тип "и к'во пá кат' е C#":
Здравей,
AMitrev,
Здравей,
Беджев Стил,
Здравей,
Nikolaeff,
Въпреки маркетинговото звучене на израза, ще се опитам да го защитя с реални неща от проекта ни:
- На първо място raw performance-a на Kestrel:
https://www.ageofascent.com/2019/02...ating-10gbe-at-7-million-requests-per-second/
Още на тази точка технологични стакове с Python, Ruby on Rails, стандартно PHP с Laravel/Symfony, node.js просто отпадат от играта. Остават примерно Java, Go, Rust, C/C++. Последните 2 защо не стават няма да коментирам даже.
Много хора като чуят .NET и си мислят за Windows, IIS и .NET Web Forms, което е изключително старо и абсолютен шит. ASP.NET Core е съвсем друга бира, върви прекрасно на linux сървъри, освен това хем зад него стои корпорация като Microsoft, хем още от основите си е напълно open-source.
Ще дам примери за няколко неща, които правим, които не са точно постижими с всяка друга технология:
- Shared Code
Както вече споменах, в комбинация с Bridge.NET постигаме това, че целият codebase е написан на един език (и той не е JavaScript), което позволява да има огромно количество споделен код между frontend-а и backend-а (models, entities, DTOs, utility code, localization/globalization, validation logic, LINQ queries, etc).
- async/await асинхронно програмиране на backend-а и на frontend-а
Ясно е че концепцията не съществува само и единствено в C# вече, но другите места, на които я има (например node.js) страдат от много други проблеми. Какви са бенефитите за performance и scalability от това да се обработват едновременно много заявки без нуждата от много паралелни thread-ове, може да се види тук:
https://msdn.microsoft.com/en-us/magazine/dn802603.aspx
https://www.carlrippon.com/scalable-and-performant-asp-net-core-web-apis-asynchronous-operations/
На фронтенда ползите са единствено syntactic sugar, но и това си е голям плюс, честно казано.
- Имаме pre-compilation инструменти, базирани на Roslyn, които генерират автоматично част от кода. Ще дам един пример: Единият от инструментите анализира кода на бекенда и автоматично генерира цели класове и методи за готова seamless комуникация между двете страни. По-конкретно как това изглежда в кода:
Shared/Product.cs
Код:
class Product : Entity
{
...
}
Backend/ProductsController.cs
Код:
public class ProductsController : BaseController
{
[HttpGet(nameof(Save))]
public async Task<ApiResult<MyData> Save(List<Product> products)
{
...
}
}
Frontend/ProductsPage.cs
Код:
public class ProductsPage : Page
{
public async void saveButton_onclick(Event e)
{
...
saveButton.State = ButtonState.Busy;
MyData myData = await ProductsController.Save(products);
//това, въпреки че изглежда като извикване на метод на фронтенда, реално прави RPC-like изпълнение на съответния action в съответния контролер на бекенда и не блокира main thread-а на браузъра, защото е async без да трябва да се правят callbacks
//отделно реализира и цялата сериализация и десериализация на сложни графи от обекти
saveButton.State = ButtonState.Normal;
}
}
Наречете го mini-WCF
- Целия codebase е абсолютно type-safe и няма нито едно място, където да има anti-patterns от рода на magic strings, magic numbers и парчетата redundant code са сведени до абсолютен минимум.
- Имаме persistent web socket процеси (невъзможно в стандартен PHP с Laravel, Symfony и т.н. например), които директно споделят информация с API endpoint-овете чрез конкурентни структури от данни, т.е. без да се правят roundtrips до базата данни или до файловата система на сървъра
- И още много други.
Повечето от нещата са постижими единствено може би с Java без да се жертва сериозно performance (node.js, Python, Ruby), но за това си има други причини да сме предпочели C# като например reified generics, LINQ, async/await syntax sugar, и т.н.
За да съм напълно подробен в избора на технологичния стак ще се наложи да изпиша 6-7 пъти по-дълъг пост обаче, така че ако някого наистина го интересува може би ще има blog post за това по-натам, сега не му е нито времето, нито мястото.
Това което бих казал като заключение е, че преките бенефити са предимно за девелопърите, но имайки предвид, че една от целите ни е marketplace за девелопъри и дизайнери, мисля че това е сравнително важно. Единствените бенефити, които са явно видими за end-user-ите са performance и scalability, като тук е възможно да се представим единствено по-добре или с lower level tech (C/C++) или с някакви много обскурни неща като Swoole, но trade-off-а вече не си струва
Ясно ми е че това сега може да се превърне в много дълъг спор за езици, технологии и пр., но тъй като не е това целта на темата, може би ще е по-добре ако някой иска да води такъв спор да го премести в отделна тема за да не нафлудим тази.
П.С.:
Относно това...
ако беше така всички щяха да пишат на .NET и всички сайтове щяха да са на .js
...ще разкажа само един кратък виц:
Вървят си един програмист и един икономист. Програмистът вижда банкнота от 100 лева на земята и казва:
- Ей гледай, има 100 лева на земята!
Икономистът въобще не поглежда надолу дори и продължава да си ходи напред:
- Не бъди глупав, ако имаше 100 лева на земята, някой вече щеше да ги е взел.