2014-02-07 4 views
4

При запуске я загружаю все свои значения 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, которые пытаются разделить одно и то же имя интерфейса на два разных свойства.


Как 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 
+0

Я теперь не VB, но и в других языках .NET, вы бы написать третий интерфейс IBoth, наследующий другие два интерфейса, и ваше свойство будет использовать тип IBoth как тип. –

+0

BTW, даже если вы «изменили имя свойства по крайней мере на одном из них», это НЕ «изменило бы API»: клиенты, у которых была переменная 'v As IAppConfig', указывающая на этот объект, все равно будут ссылаться на свойство как 'v.Server', даже если объявление было« Property ServerForApp .. ». VB управляет отображением имен во время компиляции. (Если бы VB этого не делал, класс не мог бы использоваться через этот интерфейс, что, очевидно, не было бы полезным языковым дизайном.) – ToolmakerSteve

ответ

7

Я думаю, что вы хотите, поддерживается, вы только что получили синтаксис неправильно:

Public Class ConfigValues 
    Implements IAppConfig 
    Implements IDatabaseConfig 

    Public Property ErrorPath As String Implements IAppConfig.ErrorPath 

    Public Property Server As String Implements IAppConfig.Server, 
               IDatabaseConfig.Server 

End Class 
+1

Да! Dadoy! Я пробовал ':' и ',' и целую кучу других вещей, но я продолжал повторять слово «Реализация». Это делает трюк. Благодаря! – KyleMit