8
votes

Paresseux <> injection ninject

J'utilise Ninject Cadre. Dans mon code, j'ai un objet paresseux. Je peux créer une instance, mais quand j'appelle la propriété de la valeur, j'ai eu une exception.

 private Lazy<IPsoriasisReportUserControl> psoriasisReportUserControl;

[Inject]
    public Lazy<IPsoriasisReportUserControl> PsoriasisReportUserControl
    {
        get { return psoriasisReportUserControl; }
        set { psoriasisReportUserControl = value; }
    }


0 commentaires

3 Réponses :


1
votes

Vous avez besoin d'un constructeur public par défaut sur paresseux: xxx


4 commentaires

Il y a un constructeur sans paramètre. L'injection n'utilise pas que je pense. Ne sais pas comment puis-je configurer que <


paresseux fait probablement référence au type dans la BCL. Vous serez difficile pressé pour le changer.


[TESTMETHOD] Public Void UC_DiagnosticReporte_how_lazy_works () {paresseux A = nouveau paresseux (NinjectService.get ); var b = a.value; Affirmer.isnotnull (b); } cela marche. j'ai besoin de ça


Vous devez lier ipsoriasisreportusercontrol comme ceci: kernel.bind (typeof (ipsoriasisreportusercontrol)). À (typeof (p Soriasisreportuserco ntrol); avant la liaison de paresseux <>



9
votes
Bind(typeof (Lazy<IPsoriasisReportUserControl>)).ToMethod(
            ctx => new Lazy<IPsoriasisReportUserControl>(() =>
                  Kernel.Get<IPsoriasisReportUserControl>()));

1 commentaires

Cette réponse fonctionne. Mais vous pouvez également faire l'autre réponse en utilisant simplement l'usine d'extension Ninject. Cela fonctionnera automatiquement.



13
votes

Utilisez l'extension d'usine pour Ninject https://github.com/ninject/ninject.extensions.factory


1 commentaires

En réalité, un lien vers le wiki pourrait être la référence plus utile que le référentiel de code source, car il montre comment l'injection de paresseux est censée se produire: github.com/ninject/ninject.extensions.factory/wiki/lazy