У меня есть интерфейс (называйте его 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, в котором хранится выбранное имя службы, которое будет использоваться.
Чтобы разрешить выбранную реализацию, я делаю ручную процедуру Resolve в методе Initialize этого класса, который использует эту службу.
Private _service as IAcmeService
Public Sub Initialize()
_service = container.Resolve(of IAcmeService)(_config.AcmeServiceName)
End Sub
Это не кажется правильным, потому что мой класс должен знать о контейнере. Но я не могу понять другого пути.
Существуют ли другие способы разрешить выбор конечного пользователя без знания класса о контейнере?