При запуске я загружаю все свои значения app.config в класс с именем ConfigValues
. Моя база данных нуждается только в некоторых из них, поэтому у меня есть интерфейс IDatabaseConfig
, который указывает только те параметры, которые ему нужны. Таким образом, когда я создаю класс подключения к базе данных, с инжектором конструктора, я могу потребовать, чтобы ему передавалось все, что реализует IDatabaseConfig
.Внедрение нескольких интерфейсов с одним свойством в VB.NET
Что я хотел бы сделать, это объявить несколько интерфейсов класса ConfigValues
и разрешить некоторым свойствам одновременно выполнять несколько контрактов.
Вот небольшой пример кода:
Public Interface IAppConfig
Property Server As String
Property ErrorPath As String
End Interface
Public Interface IDatabaseConfig
Property Server As String
End Interface
Public Class ConfigValues
Implements IAppConfig
Implements IDatabaseConfig
Public Property ErrorPath As String Implements IAppConfig.ErrorPath
'need different syntax - does not compile:
Public Property Server As String Implements IAppConfig.Server,
Implements IDatabaseConfig.Server
End Class
В VB.NET, есть способ, чтобы указать, что одно свойство удовлетворяет контракт на несколько интерфейсов?
Это полная противоположность этим двум вопросам SO, которые пытаются разделить одно и то же имя интерфейса на два разных свойства.
- Implementing 2 Interfaces with 'Same Name' Properties
- How to implement an interface in VB.Net when two methods have the same name but different parameters
Как cludgy обходной путь, я мог бы иметь оба свойства относятся к одной и той же основы собственности, но я должен был бы изменить имя свойства, по крайней мере, один из них, который изменяет API.
Private _server As String
Public Property ServerForApp As String Implements IAppConfig.Server
Get
Return _server
End Get
Set(value As String)
_server = value
End Set
End Property
Public Property ServerForDatabase As String Implements IDatabaseConfig.Server
Get
Return _server
End Get
Set(value As String)
_server = value
End Set
End Property
Я теперь не VB, но и в других языках .NET, вы бы написать третий интерфейс IBoth, наследующий другие два интерфейса, и ваше свойство будет использовать тип IBoth как тип. –
BTW, даже если вы «изменили имя свойства по крайней мере на одном из них», это НЕ «изменило бы API»: клиенты, у которых была переменная 'v As IAppConfig', указывающая на этот объект, все равно будут ссылаться на свойство как 'v.Server', даже если объявление было« Property ServerForApp .. ». VB управляет отображением имен во время компиляции. (Если бы VB этого не делал, класс не мог бы использоваться через этот интерфейс, что, очевидно, не было бы полезным языковым дизайном.) – ToolmakerSteve