У меня есть интерфейс (назовите его IAcmeService), который имеет несколько реализаций.
FileSystemAcmeService
DatabaseAcmeService
NetworkAcmeService
Конечный пользователь должен иметь возможность выбрать, какая реализация будет использоваться, а также сохранить этот выбор.
В настоящее время я настраиваю свой контейнер IOC (Unity) для регистрации всех известных реализаций с именем.
container.RegisterType(of IAcmeService, FileSystemAcmeService)("FileSystemAcmeService")
container.RegisterType(of IAcmeService, DatabaseAcmeService)("DatabaseAcmeService")
container.RegisterType(of IAcmeService, NetworkAcmeService)("NetworkAcmeService")
Чтобы позволить пользователю сохранить свой выбор, у меня есть файл раздела конфигурации app.config, в котором хранится выбранное имя службы для использования.
Чтобы разрешить выбранную реализацию, я делаю ручное разрешение в методе Initialize класса, который использует службу.
Private _service as IAcmeService
Public Sub Initialize()
_service = container.Resolve(of IAcmeService)(_config.AcmeServiceName)
End Sub
Это кажется неправильным, потому что мой класс должен знать о контейнере. Но я не могу найти другой способ.
Существуют ли другие способы разрешить выбор конечного пользователя без знания классом контейнера?