Laden...

Dependency Injection Service an Child-Objekt übergeben

Erstellt von Regenwurm vor 7 Jahren Letzter Beitrag vor 7 Jahren 975 Views
R
Regenwurm Themenstarter:in
295 Beiträge seit 2008
vor 7 Jahren
Dependency Injection Service an Child-Objekt übergeben

Hey Leute,

Ich habe scheinbar gerade ne echte Blockade vor dem Kopf was Dependency Injection angeht.
Und zwar stelle ich mir die Frage wie ich am besten bei einem Child-Objekt verschiedene Services injiziere, ohne dass diese im Parent Objekt verwendet werden.

Beispielcode:

public class Person
{
    private IDummyInterfaceOne _interfaceA;
    private IList<Haus> _haeuser;


	public Person(IDummyInterfaceOne interfaceA)
	{
        this._interfaceA = interfaceA;

        this._haeuser = new List<Haus>();
        for (int i = 0; i < 10; i++)
        {
            this._haeuser.Add(new Haus());  // Von wo kommt das IDummyInterfaceTwo?
        }

	}


}


public class Haus
{
    private IDummyInterfaceTwo _interfaceB;

    public Haus(IDummyInterfaceTwo interfaceB)
    {
        this._interfaceB = interfaceB;
    }
}

Person ist das Objekt welches schlussendlich mehrere Häuser instanzieren soll.
Die beiden Services 'IDummyInterfaceOne' und 'IDummyInterfaceTwo' sind im DI-Container vorhanden.

Per se fallen mir jetzt zwei Möglichkeiten ein, bin mir aber nicht wirklich sicher ob diese auch der richtige Weg sind.

  1. IDummyInterFaceTwo im Person Konstruktor deklarieren, und dann einfach weiter runtergeben
    -> Wird aber bei mehreren Services / Interfaces dann auch unsauber, und vorallem verlangt dann mein Person-Objekt Services die es eigentlich (von sich aus) ja auch gar nicht benötigt (sondern nur an das Haus Objekt weitergibt).

  2. Ich rufe den (statischen Container) auf und hole von dort jeweils den Service.

Gibts etwas was ich da nicht ganz verstanden oder bedacht habe?

Merci & Gruess,
Dani

ServiceStack & Angular = =)

D
985 Beiträge seit 2014
vor 7 Jahren

Die Klasse Person braucht zur Erfüllung aller Aufgaben beide Interfaces, also muss diese Klasse auch beide bekommen.

Eine andere Möglichkeit wäre es, wenn du einen Kontext definierst.


public class Context
{
    private readonly IServiceLocator _services;

    public Context( IServiceLocator services )
    {
        _services = services;
    }

    public IPersonService PersonService => _services.GetService<IPersonService>();
    public IHausService HausService => _services.GetService<IHausService>();
}

public abstract class ContextModel
{
    private readonly Context _context;
    public ContextModel( Context context )
    {
        _context = context;
    }

    public Context Context => _context;
}

public class Person : ContextModel
{
}

public class Haus : ContextModel
{
}