Wie kann ich Spritzen eine Eigenschaft nur, wenn der Wert nicht null ist, zur Laufzeit mithilfe von Unity?
Ich habe ein interface zu beheben, und eine von dem zugeordneten Objekt Abhängigkeiten hat eine Eigenschaft, die ich möchte ein Wert festgelegt, dass ich nur noch verfügbar, wenn ich auflösen der top-level-Objekt.
Gibt es keinen gültigen Standardwert für die Eigenschaft. Wenn nicht festgelegt, es sollte null sein, und es sollte nur gesetzt werden, wenn der Wert, den ich zur Verfügung habe zu lösen, die Zeit ist nicht null.
Ist diese bedingte Eigenschaft injection möglich?
Habe ich versucht, dieses...
container.RegisterType<ProductInstanceValidatorBase, CartItemPurchaseTypeValidator>("CartItemPurchaseTypeValidator", new InjectionProperty("AccountEntity", null);
... aber es sagte, ich konnte nicht verwenden Sie einen null-Wert!
Ich habe auch versucht, diese auf das lösen...
container.Resolve<ProductInstanceValidatorBase>(new PropertyOverride("AccountEntity", value));
...aber diese eine exception wirft, wenn der Wert null ist. Es sagt,
Parameter Typ-Inferenz, kann nicht für null-Werte. Geben Sie den parameter Typ explizit durch eine richtig konfigurierte Instanz der InjectionParameter oder InjectionParameter Klassen.
Parametername: Parameterwert
Grundsätzlich bin ich auf der Suche, um zu registrieren, eine Eigenschaft, die nur mit einem überschreiben, und dann nur, wenn die override-Wert nicht null ist. Irgendwelche Ideen? Sicherlich von einer semantischen Sicht, property injection sollte optional sein.
Prost, Ian.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen möglichen fix für dieses problem ist die Einführung einer Null-Objekt-Pattern und pass
Account.Empty
wenn Sie nicht über ein gültiges Konto. Hier ist, was eine Klasse könnte so Aussehen:Diese Weise das Konto ist nie
null
- und Entity framework würde nicht beklagen.Aber ich habe das Gefühl, dass Sie möglicherweise ein größeres problem mit dem design des Systems. IoC-container ermöglicht eine lose gekoppelten system, wo die Verdrahtung der Komponenten ist definiert vor das Programm ausgeführt wird, nicht während es laufen. Beurteilung durch die Namen, die
AccountEnyity
ist eine Entität der Klasse, nicht einer service-Klasse, und Sie normalerweise nicht register Personen mit dem IoC-container, nur Dienste.Im Lichte der oben ich würde vorschlagen, dass
AccountEntity
sollte nicht eine injizierbare Eigenschaft, sondern eine normale Eigenschaft. Sie dann externalisieren dieProductInstanceValidatorBase
Schöpfung in einer Fabrik und lassen Sie Sie kümmern sich um die EinstellungAccountEntity
EigenschaftBrauchen Sie nicht einmal zu registrieren
ProductInstanceValidatorBase
mit Einheit, sondern registrieren die Fabrik. Das ist wie mit der Fabrik würde wie folgt Aussehen:Können Sie die
InjectionParameter
mit null-Werten, sondern müssen Sie den Typ angeben.Für deine beiden Szenarien gehe ich davon aus, dass Ihr AccountEntity parameter ist vom Typ oder abgeleitet aus IAccount:
Beachten Sie, dass ich habe fallen die Namen, wie es insbesondere nicht erforderlich, in den oben genannten Szenario, aber es ist notwendig für das Szenario unten.
Ich würde eher zu Stimme mit Igor. Jedoch, wenn Sie unbedingt muss eine Lösung für den
Entity
, warum nicht einfach nehmen Sie Ihre IoC-container-constructor dependency und dann versuchenResolve
im Konstruktor?