Cadre d’dependency injection pour le cacao?

Interface Builder peut être utilisé pour l’dependency injection de base dans une application Cocoa, mais est-ce que quelqu’un connaît des structures d’dependency injection plus complètes pour Objective-C / Cocoa lorsque vous ne voulez pas instancier des objects dans un fichier NIB?

modifier

Pour clarifier, je reconnais que IB peut être utilisé pour les DI de base, mais je recherche un cadre avec des fonctionnalités plus complètes, y compris des configurations de production et de test distinctes, à l’instar de Groovy ou de Springs.

Je pense que vous constaterez que vous n’en avez pas besoin dans les langages tardifs comme Objective C, Ruby, Lisp, etc. À l’instar de la révélation de Jamis selon laquelle il tentait de créer une aiguille, un cadre DI pour Ruby- Net :: SSH revisité .

Voici quelques liens qui, nous l’espérons, vous donneront un exemple de code pour faire des choses similaires dans Objective C. Avec les catégories, vous pouvez essentiellement modifier le comportement de n’importe quelle classe à l’exécution. Voir Conseils pour les développeurs Mac – Objective-C: catégories et documents de l’ API Cocoa sur les catégories . Essentiellement, vous n’avez pas besoin d’un endroit central pour demander “la chose qui fait x” qui est configurable, car vous pouvez simplement instancier directement TheThingThatDoesX et si quelque chose doit changer / accrocher à ce comportement, il peut utiliser des catégories.

objection par AtomicObject. Il est moulé à l’image de Guice.

Je vais sortir et parler de cela. L’dependency injection telle que décrite par la meilleure réponse ne résout pas le problème fondamental que rencontrent ceux qui cherchent à l’utiliser. Nous aimerions un moyen de développement où le composant A n’instancie pas directement ou ne référence pas le composant B. Le composant A est lié par le protocole au composant B et n’est pas référencé du tout par le composant A. Cela permet de remplacer le composant B à tout moment sans jamais Toucher le composant A. J’ai voté, mais je vais faire des recherches sur vos références car il semble qu’il y en a quelques-unes qui sont d’accord avec vous. Je n’essaie pas de débattre, je cherche juste à apprendre. J’aimerais en savoir plus sur l’approche “non vous n’avez pas besoin de faire cela”.

Typhon

Il y a près d’un an, j’ai publié: https://github.com/typhoon-framework/Typhoon

Le site Web Typhoon répertorie les principales fonctionnalités. Un résumé rapide:

  • Non invasif Aucune macro ou XML requirejs. Utilise une puissante approche runtime Objective-C .

  • Il est facile d’avoir plusieurs configurations de la même classe de base ou du même protocole.

  • Pas de chaînes magiques – prend en charge le refactoring IDE, la complétion du code et la vérification à la compilation.

  • Prend en charge l’injection de contrôleurs de vue et l’intégration de storyboard.

  • Prend en charge l’injection de l’initialiseur et de la propriété, ainsi que la gestion du cycle de vie.

  • Puissantes fonctionnalités de gestion de la mémoire. Fournit des objects préconfigurés, sans la surcharge de mémoire des singletons.

  • Excellent support pour les dépendances circulaires.

  • Maigre. Son encombrement est très faible, il convient donc aux périphériques limités par la CPU et la mémoire.

  • Testé – utilisé dans toutes sortes d’applications en vedette

  • Une équipe de base dissortingbuée à l’échelle internationale (nous surveillons même StackOverflow), alors le support pour toutes vos questions n’est jamais loin 🙂

Documents API et exemple d’application

Contrôle de qualité:

Nous maintenons également un système de contrôle qualité robuste.

  • Chaque commit déclenche une série de tests de régression
  • Nous maintenons une couverture de test élevée.

Vous n’avez pas besoin d’instancier l’object dans le fichier NIB. Si vous définissez le propriétaire du fichier sur la classe de votre object, puis liez les éléments de la vue / fenêtre / quoi que ce soit, vous pouvez définir votre object en tant que propriétaire lors de l’exécution en chargeant le fichier nib manuellement. De cette façon, vous pouvez avoir une instance dynamic d’un object qui obtient toujours des dépendances injectées correctement.

Qu’en est-il de la mise en œuvre de l’dependency injection à Objective-IOC?

Qu’en est-il d’ObjectivePim? ObjectivePim

J’ai écrit un conteneur DI très simple, le code est sur GitHub . Il ne peut faire que les bases nues, c.-à-d. découvrir les dépendances d’un object et les satisfaire à l’aide d’autres objects donnés. J’ai trouvé que pour être utilisable dans des applications du monde réel, le code est très simple et amusant à pirater.

A-t-il examiné la fonctionnalité de références associatives de Mac OS X 10.6?

Je crois qu’avec cela, il serait possible de construire ou d’avoir déjà quelque chose de similaire à DI. Pour autant que je sache, toute référence nécessaire dans un object doit être récupérée manuellement en utilisant objc_getAssociatedObject ().

Manfred

Interface Builder n’effectue AUCUNE dependency injection. Il n’a pas besoin de Interface Builder sérialise les objects. Quand un nib est “réveillé” (aka ouvert), il n’y a pas de “dépendances” à résoudre – il y a juste des propriétés à définir. Très, très simple. L’ouverture d’un nib repose uniquement sur le protocole NSCoding et le codage valeur-clé.

L’dependency injection, à peu près un projet de fabrication au mieux, ou au mieux une couche de colle généralisée entre des composants conçus de manière indépendante, n’est d’aucune utilité dans un code Objective-C bien écrit. Vous demandez un outil dont vous n’avez pas besoin.

En Objective-C, un logiciel nécessitant un service anonyme déclare un protocole. Les services adoptent alors ce protocole. Les clients chargent des services en tant que plug-ins dynamics. D’autre part, si le serveur a été écrit avant le client, il suffit d’écrire un nouveau plug-in qui adapte l’interface existante au protocole. C’est moins de travail et plus simple que d’essayer de définir un système intermédiaire basé sur des données pour “découvrir” (s’il vous plaît) une interface à l’exécution.

N’est-il pas évident pour tout le monde que le grand secret de DI est juste que c’est un moyen d’écrire du code en XML plutôt que dans la langue maternelle? J’aimerais vraiment entendre un bon argument sur la manière dont XML est en quelque sorte un meilleur langage de programmation qu’un véritable langage de programmation. Cela n’a aucun sens.

Je travaille avec Spring toute la journée et j’ai vérifié Groovy. Je ne suis en aucun cas un expert XCode / Cocoa, mais IB ne fait que des injections de dépendances, ce que Groovy ne prétend même pas faire.

Je pense que vous ne cherchez pas DI, mais plutôt un ensemble de bibliothèques intégrées bien compilées, ce qui vous évite de taper beaucoup de code que d’autres personnes ont également tapé. Je pense qu’il n’existe pas de framework Spring pour Cocoa car pour une raison quelconque, les gens ont tendance à considérer «Open Source» comme «non dépendant de la plate-forme» et Cocoa est donc un peu laissé pour compte.

En fonction de vos besoins, il existe de belles librairies open source disponibles pour Cocoa, toutes répertoriées sur CocoaDev dans une belle liste .

Je sais que ce n’est pas le spring, mais j’espère que ça aide.

DI est une propriété d’un environnement d’exécution d’exécution nécessitant une liaison dynamic. Je suis très nouveau sur Obj-C et Cocoa. À moins que je ne manque quelque chose, je ne vois pas comment on pourrait implémenter DI sauf en interprétant Obj C plutôt qu’en le compilant, ou en modifiant l’environnement d’exécution.

Je soupçonne que le comportement de type DI de IB est dû au fait qu’il existe un environnement d’exécution spécifique à un domaine associé aux applications qui lui sont associées.

Je suis heureux d’être corrigé cependant.

Les catégories semblent être une implémentation de mixin, permettant l’envoi dynamic de méthodes à un délégué. Plutôt cool et similaire au concept d’interface de Java, j’ai pensé que les détails différaient et d’après ce qui suit, je ne vois pas si les constantes peuvent être définies dans une catégorie, même si les champs membres ne le peuvent pas.

catégories objective-c