7
votes

IOC d'injection de dépendance de compilération / post-construction?

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.

Y a-t-il quelque chose qui me permettrait de migrer mon IOC d'injection de dépendance pour compiler l'heure (lecture: Post-construction il tissage / remplacement)?


Élaborer

dans mon code I Configurez une liaison xxx

avec CTOR FOO (Dépendance à barres)

à la racine de mon application (sur démarrage), je résolve le graphique xxx

suppose que j'ai aucun locateur de service ( Anti-motif de toute façon droite? ). Je n'ai donc aucune utilité pour noyau plus.

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; xxx

En réalité, après le remplacement de la matrimonie de ma construction finale, il ressemble à ceci: xxx

et il y a Aucune référence à Ninject plus.

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.


14 commentaires

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 , 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 . 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 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 peut utiliser quelque chose comme posthars pour cela. postshars.net


@Chrissinclair non son hypothétique. J'utilise Fody à 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.


3 Réponses :


8
votes

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.

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.

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.

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.

Cela semble être un point d'attaque si quelqu'un voulait changer la Comportement de mon application

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.


0 commentaires


2
votes

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);
    }
}


0 commentaires