| 

.NET C# Java Javascript Exception

5
Ich versuche von einem Contract mehrere Implementierungen zu registrieren und nach Bedarf wieder herauszuholen.

Register
builder.Register(typeof(IValidator), typeof(KontaktFirmaValidator));
builder.Register(typeof(IValidator), typeof(KontaktPrivateValidator));

(Die Validatoren implementieren alle IValidator)

Im Sceenshot sieht man, das die Registrierung erfolgreich war, wenn auch alle abgelegt unter DuplicateRegistrations, jedoch unter AllRegistrations zu finden sind. Aber er holt mir den bestimmten nicht raus:

Ich bekomme die Fehlermeldung "Registration for contract 'FluentValidation.IValidator' not found, please check your registrations."

Resolve
public IValidator CreateInstance(string validatorByString)
{
return (IValidator)ServiceLocator.Instance.Container.Resolve(typeof(IValidator), validatorByString);
}


-------------------------------------
Die Lösung in meinem Fall, sieht wie folgt aus: Mein Dank geht an Matthias!

public IValidator CreateInstance(string validatorByString)
{
var validators = ServiceLocator.Instance.Container.ResolveAll(typeof (IValidator));
IValidator result = null;
if (validators != null)
{
result = (IValidator) (from v in validators
where v.GetType().Name == validatorByString
select v).FirstOrDefault();
}
return result;
}
02.02.2012
Mario Priebe 6,0k 3 9
2 Antworten
2
LightCore unterstützt seit Version 1.4 keine benannten Registrierungen mehr, was den Umgang mit Registrierungen mehrerer Objekte für das gleiche Interface recht umständlich macht. Es gab dazu mal einen Blogpost von Golo Roden, der erklärt hat, warum das Weglassen dieses Features eine gute Idee sein soll (ich fand ihn nur theoretisch überzeugend), der ist aber anscheinend nicht mehr verfügbar. Stattdessen habe ich nur noch diesen Thread gefunden.

Du hast wohl zwei Optionen:

  • Tagging Interfaces verwenden. So habe ich mir beholfen. Nicht schön, aber wirksam.
  • Mit ResolveAll<IInterface> alle registrierten Implementierungen besorgen, darüber iterieren und die gewünschte herausfischen. Oder eine Abhängigkeit vom Typ IEnumerabley<Interface> definieren, dann bekommt man darüber alle Registrierungen. (Dann doch lieber tagging interfaces, finde ich.)

Grad hab ich noch gelesen, dass es auch ein Feature gibt, bestimmte Gruppen von Registrierungen zu definieren. Evtl. wäre das noch ein Weg, aber damit hab ich gar keine Erfahrungen.
03.02.2012
Matthias Hlawatsch 13,2k 4 9
Jens Duczmal 2,6k 1 3 9
"Diesen Thread" verweist leider direkt auf www.codekicker.de Könntest Du nochmal die Verlinkung prüfen, bitte? Würde mich auch interessieren. Vor allem, was "Tagging Interfaces" sind. Ich schwanke gerade noch zwischen Lightcore und Unity.
Jens Duczmal 03.02.2012
Hm, anscheinend mag CK die URL nicht, beim Bearbeiten wurde sie aber sichtbar. Ich war so frei und habe sie mal gegen eine TinyURL (mit Vorschau) ausgetauscht.
Über einen Link zu Tagging Interfaces würde ich mich aber auch so freuen :)
Jens Duczmal 03.02.2012
Perfekt, ich habe die ResolveAll<> Variante genommen und selektiere mir das gewünschte mittels LINQ. Passt so, Danke Dir!
Mario Priebe 03.02.2012
@Jens, ja ich musste auch in den Quelltext schauen, um mir den Link zu holen : )
Mario Priebe 03.02.2012
1
Freut mich, dass meine Antwort trotz kaputtem Link hilfreich war. War schon spät gestern, wer weiß, was da passiert ist...
"Tagging Interfaces" sind (jedenfalls nach meinem Verständnis) leere Interfaces. Klassisches Beispiel ist java.io.Serializable. (Im .NET-Framework kenne ich dagegen kein Beispiel dafür.) In Bezug auf LightCore hab ich das so gemeint:
interface IKontaktFirmaValidator : IValidator {//bleibt leer!}
interface IKontaktPrivateValidator : IValidator {//bleibt leer!}
Matthias Hlawatsch 03.02.2012
Ah, danke. Doch so einfach :)
Jens Duczmal 03.02.2012
2
Hi Mario,

versuch mal die Validatoren mit einem Namen zu registrieren. Ein Aufruf
builder.Register(typeof(IValidator), typeof(KontaktFirmaValidator)).WithName("KontaktFirama");
sollte vorhanden sein. (Aus dem Kopf, untested).

Viel Erfolg
Florian
02.02.2012
ffordermaier 8,4k 3 9
Hat leider so nicht funktioniert, Danke dir trotzdem ;)
Mario Priebe 03.02.2012

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH