Как получить доступ к глобальным объектам обслуживания (подобным инъекции)? - PullRequest
0 голосов
/ 10 мая 2019

Я довольно новичок в флешке, но под заголовком я хочу создать сервисный объект, который можно использовать во всех контроллерах или сервисах.

В Java (Spring) я бы создал @Bean:

@Configuration
public class WhateverGatewayBeans {

    @Value("{whatever.api.key}")
    public String apiKey;

    @Bean
    public WhateverGateway getWhateverGateway() {
        return new WhateverGateway(apiKey)
    }
}

, который теперь можно использовать во всех моих @Service s:

@Service
public class AnyService {

    private final WhateverGateway whateverGateway;

    @Autowired // Using injection
    public AnyService(WhateverGateway whateverGateway) {
        this.whateverGateway = whateverGateway;
    }

    public Something getSomethingFromWhatever(String param) {
        return this.whateverGateway.getSomething(param);
    }
}

И так далее

@Controller
public class AnyController {

    private final AnyService anyService;

    @Autowired
    public AnyController(AnyService anyService) {
        this.anyService = anyService;
    }

    @RequestMapping(name = "/api/whatever")
    public Something getSomething(@QueryParam("param") String param) {
        return this.anyService.getSomething(param);
    }
}

Обратите внимание, что приведенный выше код был написан на лету и, вероятно, будет не на 100% правильным, но вы поняли, что

Яищем что-то подобное во Flask:

@app.route('/api/something')
def get_something(whatever_gateway):
    param = request.args.get('param')
    return whatever_gateway.get_something_from_whatever(param)

Здесь whatever_gateway должна быть полностью инициализирована при запуске сервера.Представьте, что он должен загружаться некоторое время, сервер не должен быть включен до того, как whatever_gateway будет готов.

1 Ответ

0 голосов
/ 10 мая 2019

Обычно вы создаете свой шлюз на уровне модуля:

# gateways.py
whatever_gateway = WhateverGateway()

А затем просто импортируйте:

from gateways import whatever_gateway

@app.route('/api/something')
def get_something(whatever_gateway):
    param = request.args.get('param')
    return whatever_gateway.get_something_from_whatever(param)

Однако были и другие решения для внедрения зависимости, или вы можете свернуть свое собственное. Я сделал это один раз, и это было легко. Однако позже я понял, что большую часть времени вы можете просто использовать модули, как показано выше.

Если создание экземпляра шлюза занимает некоторое время, вы можете отложить его, чтобы увеличить время запуска приложения, поместив его в некую фабрику:

gateway = None

def get_gateway():
    global gateway
    if not gateway:
        gateway = WhateverGateway()
    return gateway
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...