2011-01-10 19 views
0

Kann eine Zuordnung zur Laufzeit entfernt werden? Ich kann mit einem leicht genug, um hinzuzufügen:Entfernen eines Standardinstanztyps aus StructureMap zur Laufzeit

ObjectFactory.Configure(ce => 
     ce.ForRequestedType<IDateAdjuster>(). 
      TheDefaultIsConcreteType<DateAdjusterForTest>()); 

und ich kann überprüfen, ob eine Abbildung mit existiert

ObjectFactory.Model.HasDefaultImplementationFor<IDateAdjuster>() 

aber ich kann nicht eine Standardinstanz Typ zu entfernen scheint. Ich versuchte dieses

var config = ObjectFactory.Model.PluginTypes 
      .FirstOrDefault(pt => pt.PluginType == typeof(IDateAdjuster)); 
if (config != null) {config.Default = null;} 

Aber das funktioniert nicht.

Was die Schnittstelle tut ist verstecken die DateTime.Now und DateTime.Today Eigenschaften, so dass während des Testens, insbesondere Integration und Benutzerakzeptanz, das System so konfiguriert werden kann, das aktuelle Datum und Uhrzeit zu verschieben, wie es es sieht.

Was ich versuchte, war um zu sehen, zu tun, wenn es eine Standardimplementierung der Schnittstelle war, wenn es dann war ich würde erstellen und rufen, wenn nicht, dann würde ich nur DateTime.Now verwenden und DateTime.Today


Wie es scheint, kann ich der Strukturkarte nicht sagen, dass sie den Standardtyp entfernen soll. Daher habe ich jetzt eine neue Standardimplementierung der Schnittstelle hinzugefügt und die Schnittstelle so erweitert, dass eine Eigenschaft anzeigt, ob sie aktiv ist. Die Standardimplementierung gibt an, dass die Schnittstelle nicht aktiv ist. So kann ich jetzt immer eine Instanz bekommen und dann prüfen, ob ich sie benutzen möchte.

Das System hat ziemlich viel datums- und zeitspezifisches Verhalten und daher muss der Client in der Lage sein zu testen, wie sich das System zu verschiedenen Daten und Zeiten verhält. Sie loggen sich in den Admin-Bereich ein und setzen dann Datum und Uhrzeit auf die entsprechenden Werte, dann wechsle ich die Standardimplementierung auf die Testimplementierung, die die entsprechende Anpassung vornimmt.

Da es nur die Implementierung der Schnittstelle ist, die ich gerade schalten ändert, welche Implementierung ich verwenden möchte, wenn der Client Server-Betreiber setzt, und dann zurückgesetzt, wenn sie

Antwort

1

Also wenn der Schalter von etwas gesteuert wird, ändert der Benutzer, ich rate es in der Datenbank oder vielleicht Sitzung? Wenn dies der Fall ist, können Sie das bedingte Konstruktionsmerkmal von StructureMap, dies zu tun:

var container = new Container(x => 
{   
    x.InstanceOf<IDateAdjuster>().Is.Conditional(o => 
    {     
    o.If(c => c.GetInstance<IUserSettings>() 
    .UseTestDateAdjuster).ThenIt.Is.OfConcreteType<DateAdjusterForTest>(); 

    o.TheDefault.Is.OfConcreteType<DateAdjuster>(); 
    }); 
}); 

IUserSettings könnte alles sein, die in Ihrem registriert ist enthalten, dass werden Ihnen sagen, wenn der Benutzer das Datum und die Uhrzeit in der eingestellten Adminbereich.

Sehen Sie dieses Blog für weitere Informationen: http://codebetter.com/jeremymiller/2009/01/19/conditional-object-construction-in-structuremap-i-e-fun-with-lambdas/

+0

Das könnte funktionieren, leider ist das Beispiel nicht zu klar. Das Hauptproblem ist, dass der Konstruktor nicht weiß, welche Instanz er benötigt, und ich bin mir nicht sicher, wie ich das If – baralong

+0

Wenn Sie Ihre Frage mit einem Beispiel der Logik bearbeiten, die Sie verwenden würden, um die Entscheidung zu treffen, kann ich es versuchen um vorzuschlagen, wie es in diese Syntax passen würde. –

+0

Bearbeitet die Frage, irgendwelche Tipps zur bedingten Konstruktion? Oder benötigen Sie mehr Informationen? – baralong

2

Ändern der IoC Konfiguration zur Laufzeit durchgeführt werden, ist ein bisschen beängstigend IMO. Vielleicht wäre die Verwendung einer Fabrik eine sauberere Lösung. Zum Beispiel:

public interface IOptionalFactory 
{ 
    IOptional GetInstance(IPrinciple currentUser); 
} 

können Sie die IOptionalFactory anstelle einer IOptional Schnittstelle injizieren und lassen die Fabrik verschiedene Instanzen zurückgeben auf der Grundlage der Benutzerinformationen geliefert.

+1

Warum ist IOC-Konfiguration zur Laufzeit beängstigend? Ich bin gerade dabei, dem IOC mitzuteilen, dass das System in einen Zustand eingetreten ist, in dem ich nun eine Implementierung der Schnittstelle verwenden möchte.An dieser Stelle denke ich, dass ich eine Null-Implementierung als Standard haben und zwischen den beiden wechseln werde. – baralong

+0

Ändern der Konfiguration Ihres Containers, nachdem Sie es im Kompositionswurzel eingerichtet haben, macht die Konfiguration viel komplexer mit viel mehr Veränderung, es falsch zu machen. Wahrscheinlich müssen Sie Komponententests für diesen Code schreiben. Es ist schwer für mich zu sehen, welches Problem Sie lösen wollen, aber ich denke nicht, dass Sie dafür ein komplexes Konstrukt brauchen. Vielleicht können Sie Ihre Frage mit Informationen über den tatsächlichen Anwendungscode aktualisieren. – Steven

Verwandte Themen