Создание блога на Dart. Часть 1.

12.07.2017 at 18:00

Создание блога на Dart. Часть 1.
Создание блога на Dart. Часть 2.
Создание блога на Dart. Часть 3.

HTTP сервер на Dart

Язык Dart позиционируется его создателями как язык, который можно использовать как на клиенте, так и на сервере. И если с клиентом, блягодаря ангуляру, вопросов не возникает, то на сервере dartlang используют редко. Я решил попробовать Dart именно как серверный язык и написать на нем блог.

Структура блога проста — есть страницы постов и есть страницы со списком постов. Для начала создадим в папке проекта подпапку httpserver и в ней создадим файл server.dart. Этот файл будет точкой входа приложения. В нем будет только один метод main.

Future main() async {
  HttpServer requestServer =
      await HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, 4040);

  Router router = injector.get(Router);
  print('listening on localhost, port ${requestServer.port}');

  try {
    await for (HttpRequest request in requestServer) {
      await router.processRequest(request);
    }
  } catch (e) {
    print(e.toString);
  }
}

Класс HttpServer инкапсулирует в себе логику HTTP сервера. Так же он реализует интерфейс Stream, что позволяет ипользовать синтаксический сахар await for для реакции на реквесты.

Dependency Injection в Dart

DI контейнер находится в пакете di. Для его подключения нужно его указать в файле pubspec.yaml:

dependencies:
  di: ">=3.3.4 <4.0.0"

Создается контейнер следующим образом:

import 'package:di/di.dart';
...
ModuleInjector _injector;

void _initInjector(){
  _injector = new ModuleInjector([new Module()
      ..bind(Router)
      ..bind(PostRepository)
  ]);
}

ModuleInjector get injector {
  if (_injector == null)
    _initInjector();
  return _injector;
}

Здесь инжектор сделан одиночкой.

При регистрации зависимостей я не указываю отдельно интерфейс и реализацию, потому что я не стал разделять. Но это позволит в будущем переопределить реализацию не трогая весь остальной код.

Пример получения зависимости был выше

Router router = injector.get(Router);