C# ServiceCollection und Listen

Ghost_Rider_R

Lieutenant
Registriert
Nov. 2009
Beiträge
752
Hallo zusammen,

wie sollte denn die Vorgehensweise bei ServiceCollection sein, wenn man Listen von Objekten hinzufügen möchte,
welche mit vordefinierten Objekten gefüllt sein sollen?
Er weiß dann ja nicht, welche Objekte in der Liste enthalten sein sollen.

also z.B. sowas:

IList<Person> personenListe = new List<Person>(){new Person("Karl"), new Person("Heinz"));

Wäre das ein Fall für eine Factory?

LG Ghost
 
Hmm?
Was willst du tun?
Im DI eine Liste mit fixen Elementen registrieren oder mehrere Services für das gleiche Interface registrieren?

Das 1. Geht über die normalen Methoden, das 2. Ist TryAddEnumerable
 
  • Gefällt mir
Reaktionen: tollertyp
Ehrlich gesagt verstehe ich nicht, was du genau wllst.
Ghost_Rider_R schrieb:
Er weiß dann ja nicht, welche Objekte in der Liste enthalten sein sollen.
Und woher weiß wer welche Objekte das sein sollen?

Ich würde sagen: Beschreib doch dein Ausgangsproblem, was du erreichen willst.
 
Ghost_Rider_R schrieb:
IList<Person> personenListe = new List<Person>(){new Person("Karl"), new Person("Heinz"))
var persons = new List<Person>
{
new("Karl"),
new("Heinz")
};

Wäre ungefähre die neuere syntax :)

Aber was ist das problem? Was wilst du lösen?
 
Lesbarkeit und keine denglishe variablen z.b.
Aber ja weiter hast du nicht gelesen.

/E nennt man auch code review.
 
Ich habe eine komplexere Methode, welche mir eine Liste erstellt und diese mit einigen Objekten füllt. Also quasi das hier:

C#:
IList<Person> GenerierenWichtigeListe(IWichtigesObjekt einwichtigesObjekt)
{
var persons = new List<Person>
{
new("Karl", einWichtigesObjekt),
new("Heinz", einWichtigesObjekt)
};
return persons;
}

Jetzt ist es aber so, dass die Klasse Person selbst ein ,,wichtiges Objekt" benötigt, welches die ServiceCollection bzw. der daraus generierte Provider erst bereitstellen muss d.h. die ServiceCollection muss vor Aufruf der Methode bereits erstellt sein und erst im Nachgang kann die Methode GenerierenWichtigeListe aufgerufen werden.

Die ServiceCollection weiß ja nicht, wie Sie diese Liste denn zusammenbauen soll bzw. dass Sie in diesem Beispiel aus zwei Personen bestehen soll.

Es sind also 2 Unklarheiten:
  1. Kann man der ServiceCollection nachträglich dieses befüllte Listen-Objekt bekanntgeben, sodass diese später über den Provider abgerufen werden kann?
  2. Kann man die Methode GenerierenWichtigeListe in der ServiceCollection so registrieren, sodass diese erst ausgeführt wird, wenn ein Objekt tatsächlich angefordert wird? Wenn ich sowas mache, dann wird die Methode GenerierenWichtigeListe direkt beim Registrieren aufgerufen: ServiceCollection sc = new ServiceCollection(); sc.AddSingleton<IList<Person>>(GenerierenWichtigeListe). Das widerrum geht aber noch nicht, da der Provider zum Erstellen einer Person ja noch nicht erstellt wurde, welcher die Klasse Person aber für das wichtige Objekt benötigt.
Ich hoffe das Problem nun etwas besser beschrieben zu haben.

LG Ghost
 
Für mich ist noch nicht klar, warum diese Liste in der ServiceCollection enthalten sein muss. In meinen Augen hast du nach wie vor nicht beschreiben, was dein Problem ist, sondern wie du es zu lösen versuchst.

Kenny [CH] schrieb:
Lesbarkeit und keine denglishe variablen z.b.
Denglische Variablen habe ich ehrlich gesagt nicht gesehen. Aber vielleicht habe ich nur nicht weit genug gelesen.
Fragte mich nur, welchen Mehrwert die Syntax für das Problem bringt. Also kurz zusammengefasst: Keinen.
 
Kannst du evtl eine static class oder so machen? Aka var impPersons = Persons.GenerateImportantPersons();
Wenn dies im provider als variable gehalten werden soll dann public List<Person> ImportanPersons => GenerateImportantPersons(); ?

/E oder als public IEnumerable importantPersons.... Rest

Über mir Lesbarkeit. Ilist<person> = new list<xyz> {a,b,c} ist auch mehr hazzle zum schreiben als. Var variable = new list{a,b,c}; aber egal / off topic - imho neuere syntax oft leserlicher/einfacher als alte
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: tollertyp
Ghost_Rider_R schrieb:
Kann man der ServiceCollection nachträglich dieses befüllte Listen-Objekt bekanntgeben, sodass diese später über den Provider abgerufen werden kann?
Nein, du kannst nachträglich da nichts neues hinzufügen.

Du kannst aber auch einfach eine leere Liste hinzufügen, die dann abrufen und später befüllen. Du bekommst ja die gleiche Instanz zurück.

So oder so dürfte das alles Bad practice sein und du solltest deine Ideen da nochmals genauer gesagt überdenken.
 
  • Gefällt mir
Reaktionen: tollertyp
@Tornhoof: Ja, nicht alles was geht ist auch sinnvoll.
Und gerade weil der TE ja fragt, was sinnvoll ist, ist es um so überraschender, dass er eben die Absicht nicht erklärt, sondern seinen Lösungsversuch.
 
  • Gefällt mir
Reaktionen: Kenny [CH]
tollertyp schrieb:
Und gerade weil der TE ja fragt, was sinnvoll ist, ist es um so überraschender, dass er eben die Absicht nicht erklärt, sondern seinen Lösungsversuch.
Nennt sich dann XY-Problem 🤷‍♂️
 
  • Gefällt mir
Reaktionen: tollertyp
Zurück
Oben