مرحبا هبر! لقد قمت بإصدار نسخة رئيسية جديدة من حاقن التبعية .
السمة الرئيسية لهذا الإصدار هي الأسلاك. يسمح لك بحقن الوظائف والأساليب دون سحبها في حاوية.
from dependency_injector import containers, providers
from dependency_injector.wiring import Provide
class Container(containers.DeclarativeContainer):
config = providers.Configuration()
api_client = providers.Singleton(
ApiClient,
api_key=config.api_key,
timeout=config.timeout.as_int(),
)
service = providers.Factory(
Service,
api_client=api_client,
)
def main(service: Service = Provide[Container.service]):
...
if __name__ == '__main__':
container = Container()
container.config.api_key.from_env('API_KEY')
container.config.timeout.from_env('TIMEOUT')
container.wire(modules=[sys.modules[__name__]])
main() # <--
with container.api_client.override(mock.Mock()):
main() # <--
عندما يتم استدعاء الوظيفة ، يتم جمع
main()التبعية Serviceوتمريرها تلقائيًا.
أثناء الاختبار ، يتم استدعاؤه
container.api_client.override()لاستبدال عميل API بـ mock. عندما يتم استدعاؤها ، سوف تجمع main()التبعية Serviceوهمية.
تعمل الميزة الجديدة على تسهيل استخدام Dependency Injector مع أطر عمل Python الأخرى.
كيف الربط يساعد على التكامل مع الأطر الأخرى؟
يتيح الربط الحقن الدقيق بغض النظر عن هيكل التطبيق. على عكس الإصدار 3 ، لا يتطلب حقن التبعية سحب دالة أو فئة في حاوية.
مثال مع قارورة:
import sys
from dependency_injector import containers, providers
from dependency_injector.wiring import Provide
from flask import Flask, json
class Service:
...
class Container(containers.DeclarativeContainer):
service = providers.Factory(Service)
def index_view(service: Service = Provide[Container.service]) -> str:
return json.dumps({'service_id': id(service)})
if __name__ == '__main__':
container = Container()
container.wire(modules=[sys.modules[__name__]])
app = Flask(__name__)
app.add_url_rule('/', 'index', index_view)
app.run()
أمثلة أخرى:
كيف يعمل الربط؟
من أجل تطبيق الربط تحتاج:
- .
Provide[Container.bar]. . - . container.wire(modules=[...], packages=[...]) , .
- . .
يعمل التجليد على أساس التأمل. عندما يتم استدعاؤه ، فإن
container.wire(modules=[...], packages=[...])إطار العمل سوف يمر عبر جميع الوظائف والطرق في هذه الحزم والوحدات النمطية ويفحص معلماتها الافتراضية. إذا كانت المعلمة الافتراضية هي علامة ، فسيتم تصحيح هذه الوظيفة أو الطريقة بواسطة مصمم حقن التبعية. يقوم هذا المصمم ، عند استدعائه ، بإعداد وحقن التبعيات بدلاً من العلامات في الوظيفة الأصلية.
def foo(bar: Bar = Provide[Container.bar]):
...
container = Container()
container.wire(modules=[sys.modules[__name__]])
foo() # <--- "bar"
# :
foo(bar=container.bar())
تعلم المزيد حول الارتباط هنا .
التوافق؟
الإصدار 4.0 متوافق مع الإصدارات 3.x.
وحدات التكامل
ext.flaskوو ext.aiohttpعلقت لصالح تجميع.
عند الاستخدام ، سيعرض إطار العمل تحذيرًا ويوصي بالتبديل إلى الارتباط.
يمكن العثور على قائمة كاملة من التغييرات هنا .
ماذا بعد؟
- تحقق من المشروع جيثب
- تحقق من الوثائق