Auflösen des Typs basierend auf dem Konfigurationswert des Endbenutzers

Ich habe eine Schnittstelle (nennen Sie es IAcmeService), die mehrere Implementierungen hat.

FileSystemAcmeService
DatabaseAcmeService
NetworkAcmeService

Der Endbenutzer muss in der Lage sein, die zu verwendende Implementierung auszuwählen und diese Auswahl zu speichern.

Derzeit konfiguriere ich meinen IOC-Container (Unity) so, dass alle bekannten Implementierungen mit einem Namen registriert werden.

container.RegisterType(of IAcmeService, FileSystemAcmeService)("FileSystemAcmeService")
container.RegisterType(of IAcmeService, DatabaseAcmeService)("DatabaseAcmeService")
container.RegisterType(of IAcmeService, NetworkAcmeService)("NetworkAcmeService")

Damit der Benutzer seine Auswahl speichern kann, habe ich die Konfigurationsabschnittsdatei app.config, in der der ausgewählte Dienstname für die Verwendung gespeichert ist.

Um die ausgewählte Implementierung zu beheben, führe ich eine manuelle Auflösung in der Initialize-Methode der Klasse durch, die den Service verwendet.

Private _service as IAcmeService
Public Sub Initialize()
    _service = container.Resolve(of IAcmeService)(_config.AcmeServiceName)
End Sub

Dies scheint nicht richtig zu sein, da meine Klasse über den Container Bescheid wissen muss. Aber ich kann keinen anderen Weg finden.

Gibt es andere Möglichkeiten, die Auswahl durch Endbenutzer zuzulassen, ohne dass die Klasse etwas über den Container weiß?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage