J'utilise actuellement NIJJECT pour lier les interfaces aux types de béton et les injecter dans mes classes. Cependant, je crois comprendre que c'est une affaire d'exécution. Pour moi, cela semble être un point d'attaque si quelqu'un voulait changer le comportement de ma demande.
Élaborer em> p> dans mon code I Configurez une liaison P> avec CTOR à la racine de mon application (sur démarrage), je résolve le graphique p> suppose que j'ai aucun locateur de service fort > ( Anti-motif de toute façon droite? ). Je n'ai donc aucune utilité pour Maintenant, je veux avoir une "compilation de version post-construction" qui remplace le moteur de résolution du noyau avec des instanciateurs ou des références à constante / singleton, etc., alors que mon code ressemble à ceci; p> En réalité, après le remplacement de la matrimonie de ma construction finale, il ressemble à ceci: p> et il y a Aucune référence à Ninject plus. P> My Rational pour cette question est que j'utilise Fody à IL Tisser tous mes collègues de propriété et je me demandais s'il serait possible de faire quelque chose de similaire pour l'injection de dépendance. p> p>
FOO (Dépendance à barres) Code> P>
noyau code> plus. p>
3 Réponses :
d'une perspective de sécurité en général, l'utilisation d'un conteneur DI ne présente aucune menace supplémentaire pour votre application. P>
Lorsque vous écrivez un service (tel que Web Service ou site Web), l'attaquant ne pouvait modifier que le comportement di configuré de l'application lorsque cette application ou cette serveur a déjà été compromise. Lorsque cela se produit, le serveur doit être considéré comme perdu (vous devrez reformater ce serveur ou le jeter complètement). DI ne fait pas cela pire, car un conteneur DI ne permet généralement pas que le comportement soit changé de l'extérieur. Vous devrez faire quelque chose de très bizarre pour que cela se produise. P>
Pour une application qui fonctionne sur la machine de l'utilisateur, vous devez toujours considérer que l'application doit être compromise, car un attaquant peut décompiler votre code, modifier le comportement au moment de l'exécution, etc. à nouveau, DI ne fait pas cela Pire, car vous ne pouvez vous protéger que contre les attaques sur la limite de service. Cette application client doit communiquer avec le serveur et l'endroit où stocker vos avoirs précieux est dans les limites de service. Par exemple, vous ne devez jamais stocker un mot de passe de compte dans une DLL sur le client. Peu importe que cela soit crypté ou non. P>
L'utilisation de DI cependant, peut le rendre un peu plus facile pour un attaquant de modifier le comportement d'une application client, en particulier lorsque vous configurez tout en XML. Mais cela détient tout ce que vous stockez dans le fichier de configuration. Et si c'est votre seule ligne de défense (avec ou sans DI), vous êtes de toute façon vissée. P>
Cela semble être un point d'attaque si quelqu'un voulait changer la Comportement de mon application P> blockQuote>
Veuillez noter que toute application peut être décompilée, modifiée et recompantée. Peu importe que ce soit géré (.NET, Java) ou non (C ++), ou obscurci ou non. Encore une fois, d'une perspective de sécurité, peu importe si vous faites de l'exécution DI ou de la compilation-Time DI. Si tel est un problème, ne déployez pas ce code sur des machines que vous n'avez pas de contrôle. P>
Comme discuté, vos raisons citées de faire cela ne s'additionnent pas. Cependant, Philip Laureano (Linfu Auteur) a fait un Projet Hiro < / a> Un peu de temps qui fait le pré-déploiement di. Aucune idée si elle allait n'importe où ... p>
À la réflexion, c'est la seule réponse jusqu'à présent qui répond à la question, plutôt que de mon original rationnel pour le demander. Le CIO en elle-même est un concept de conception, que l'application du conteneur d'inversion soit effectuée manuellement, à l'heure de la compilation ou au moment de l'exécution. Donc, je change de réponse acceptée à cela. J'aimerais toujours voir un IL Weaver comme une Fody. : P
@Meirionhughes ha, qu'est-ce qui vous a pris si longtemps: D Je vois que j'ai suscité l'autre réponse car il est utile, quel que soit le ho, il y a directement réparé. La seule prochaine étape logique basée sur votre commentaire est bien sûr pour vous faire à un PR à Fody Tirer parti de Hiro comme base: P
Eh bien, je cherche une raison de faire un addon Fody. : P
Je travaille sur un conteneur de compilée IOC pour .NET Utilisation des générateurs de sources:
HTTPS: // github.com/yairhalberstadt/stronginject p>
https: // www .nuget.org / forfaits / StrongInject / p>
Avec celui-ci, vous pouvez procéder comme suit: P>
using StrongInject; [Registration(typeof(Foo), typeof(IFoo))] [Registration(typeof(Bar), Scope.SingleInstance)] public class Container : IContainer<IFoo> {} public static class Program { public static void Main() { new Container().Resolve(foo => //use foo here); } }
Les enregistrements de dépendance NINJECT sont-ils dans XML ou en code?
Pourriez-vous s'il vous plaît expliquer plus en détail ce qui compilait l'injection de temps?
Je présume que votre configuration de votre di est effectuée en code via les modules. Donc, vous avez déjà compilé la sécurité de l'heure, même si la connexion DI arrive pendant l'exécution. Cependant, cela se déroule sur une tangente, si nous regardons le problème que vous mettez en avant Mon DI arrive au moment de l'exécution, mais je veux que cela se produise lors de la compilation B>, pourquoi voudriez-vous utiliser une injection de dépendance dans la première place? Vous pouvez également simplement supprimer les modules et attribuer manuellement des instances ou des usines aux implémentations afin qu'il n'y ait pas d'exécution point d'attaque i>. Pour moi la moitié de la raison pour laquelle vous utilisez di consiste à obtenir la configuration d'exécution
L'ensemble du point de CIO est de le faire au moment de l'exécution.
Pouvez-vous expliquer ce que vous entendez par point d'attaque? Vous parlez de quelqu'un qui remplace l'une de vos implémentations avec un voyou, en remplaçant l'une de vos DLL? Si tel est le problème, je vous recommande de regarder le nom fort de la signature de vos DLL.
@Ilaivanov, bien, disons que j'avais VIOO et une barre qui veut IFOO en CTOR. J'ai configuré la liaison dans le code, compiler, exécuter. Ninject Kernel commence, je demande une barre et cela résout la dépendance. Mais j'ai compilé ma définition de liaison. Je compile déjà mon intention, mais je dois attendre le temps d'exécution pour la résolution. Je pense que je ne vois pas pourquoi je ne peux pas avoir une étape post-construction qui résolvait les dépendances et remplace avec du code IL entières.
@Meirionhughes Si tel est pour une efficacité / optimisation, avez-vous un impact réel mesurable i> de NIJECT DI? Est-ce actuellement un goulot d'étranglement qui a une incidence négative sur l'expérience utilisateur?
Je ne peux pas être sûr .. C'est un coup dans le noir. Vous May i> peut utiliser quelque chose comme posthars pour cela. postshars.net
@Chrissinclair non son hypothétique. J'utilise
Fody Code> à IL Weave mes graves de la propriété et je me demande si quelque chose de similaire pourrait être fait pour Ninject.
Ce dont vous parlez, c'est des outils post-compilation tels que PostSharp. Le problème avec ces outils est en fait qu'ils font la compilation post. Cela rend à nouveau des tests unitaires aussi difficiles à ne pas utiliser di du tout (une des principales raisons de faire DI).
@Steven ahh ... oui, bon point. Mais que se passe-t-il si j'ai quelque chose qui remplace l'IOC IL-Code uniquement sur la libération (après le test)? Build-Server-> Test-> OnBass-> Remplacer Ninject par code en béton tissé IL-> Libération
@Meirionhughes: serait possible en théorie, mais quel est le point de faire ça?
Si vous souhaitez avoir une assistance de temps compilée en raison de raisons de performances, vous devez consulter Injecteur simple . Ses caractéristiques de performance sont similaires à ce que vous trouverez lors de l'utilisation d'outils de tissage de code tels que PostSharp.
Un endroit où de telles choses seraient formidables sont de gros addons VSTO pour Excel où le conteneur est utilisé pour toutes choses. La construction de conteneurs peut prendre 100 ms de 2 000 ms de démarrage supplémentaire, entravant l'expérience utilisateur Excel.