83 votes

Combiner DI avec les paramètres du constructeur ?

Comment combiner l'injection de constructeur avec des paramètres de constructeur "manuels" ? c'est à dire.

 public class SomeObject
{
    public SomeObject(IService service, float someValue)
    {
    }
}

Où IService doit être résolu/injecté par mon conteneur DI, et someValue doit être spécifié. Comment mélanger les deux ?

6voto

Jess Points 8425

Vous ne devriez vraiment pas essayer d'utiliser DI pour cela. Vous pouvez proposer toutes sortes de solutions farfelues, mais elles peuvent ne pas avoir de sens par la suite.

Notre approche consiste à créer une fabrique via DI, et la méthode Create de la fabrique se construirait ensuite à l'aide du conteneur DI transmis. Nous n'avons pas besoin d'utiliser ce modèle souvent, mais lorsque nous le faisons, cela rend le produit beaucoup plus propre (puisqu'il rend nos graphiques de dépendance plus petits).

4voto

Arek Points 792

Autre approche - initialisation en deux étapes (non liée à ninject, aucun framework DI) :

 public class SomeObject
{
    private readonly IService _service;

    public SomeObject(IService service)
    {
        // constructor only captures dependencies
        _service = service;
    }

    public SomeObject Load(float someValue)
    {
        // real initialization goes here
        // ....

        // you can make this method return no value
        // but this makes it more convienient to use
        return this;
    }
}

et utilisation :

 public static class TestClass
{
    public static void TestMethod(IService service)
    {
        //var someObject = new SomeObject(service, 5f);
        var someObject = new SomeObject(service).Load(5f);
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X