Здравствуйте.
Я потихоньку осваиваю раст, и решил по ходу писать на нем небольшое приложение, чтобы лучше понять принципы разработки на нем. Проблема у меня возникла буквально сразу. Возьмем для примера вот такую сферическую архитектуру в вакууме, без характерных расту усложнений:
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();
}
В принципе, не важно макрос это будет, или нет. Хотя, реализация, которая будет работать во время компиляции а не выполнения даже предпочтительнее.
Есть ли уже какие-нибудь практики, или, может быть, идеи, как это лучше делать в расте?