@fynivx
Software Engineer ( .NET )

Как реализовать Inversion of Control в Rust?

Здравствуйте.
Я потихоньку осваиваю раст, и решил по ходу писать на нем небольшое приложение, чтобы лучше понять принципы разработки на нем. Проблема у меня возникла буквально сразу. Возьмем для примера вот такую сферическую архитектуру в вакууме, без характерных расту усложнений:

trait Some {
  fn get_id(&self) -> int;
}

trait SomeFactory {
  fn create_some(&self) -> &Some
}

struct MyApp {
  factory: &SomeFactory
}

impl MyApp {
  fn new(f: &SomeFactory) -> MyApp {
    MyApp {
      factory: f
    }
  }
}


Без IoC контейнера я могу сделать что-то в этом роде:

fn bootstrap() -> MyApp {
  let factory = MyFactory::new();
  MyService::new(&factory)
}

fn main() {
  let app = bootstrap();
  app.run();
}


Но, естественно, я не хочу, чтобы при каждом изменении списка параметров в ::new мне приходилось лезть в bootstrap и вручную переделывать инициализацию приложения. Вот, чего я хочу добиться:

fn bootstrap() -> IoC {
  let IoC = IoC::new();
  IoC.Register<SomeFactory, MyFactory>();
  IoC.Register<SomeApp, MyApp>();

  IoC
}

fn main() {
  let IoC = bootstrap();
  let app = IoC.Resolve<SomeApp>();
  app.run();
}


В принципе, не важно макрос это будет, или нет. Хотя, реализация, которая будет работать во время компиляции а не выполнения даже предпочтительнее.

Есть ли уже какие-нибудь практики, или, может быть, идеи, как это лучше делать в расте?
  • Вопрос задан
  • 289 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы