Подход к интерфейсу входа канала и исключить из конкретных каналов журнал


У меня есть библиотека, которая посылает/лесозаготовки информации по каналам журналов различных как по электронной почте, SMS или сохранить в файл. Он работает нормально, но хотелось бы узнать ваше мнение и получить комментарий код относительно моего текущего кода. Это понятно? Это достаточно хорошо в соответствии с ООП и использования интерфейса. Также я хотел бы изменить его немного и рассчитываю на вашу поддержку.

Описание:

Для некоторых конкретных классов (например SpecificClass) я регистрируя, какие каналы я хочу использовать, и пропуская его через NotificationChannelEngine в конструктор. Вот один вопрос если я зарегистрируюсь на всех каналах, использовать каждый место, когда я посылаю всех зарегистрированных классов. Я хотел бы когда-нибудь сказать - ОК, даже если у меня есть 3 зарегистрированных каналов для какой-либо конкретной линии я хочу использовать только 2 из 3 зарегистрированных каналов или только один из них. Любые предложения по изменению/настройка ценится в качестве ответа.

Пример: ниже линии будем называть все зарегистрированы каналы:

NotificationChannelEngine.Process(New Message() With {.Text = "DoSomething1 --> Some operation 1"}

Как скажем, например для этой линии только почтового канала для использования только?

Весь текущий код:

Интерфейсы:

Public Interface INotificationChannel
       Sub Send(message As Message)
End Interface

Public Interface INotificationChannelEngine
       Sub Process(message As Message)
End Interface

Бетонные каналы:

Public Class FileNotificationChannel : Implements INotificationChannel          
       Public Path as string

       Public Sub Send(message As Message) Implements INotificationChannel.Send
              'Log class to log message to file
               Logger.Log(message.Text, Path)
       End Sub
End Class

Public Class MailNotificationChannel : Implements INotificationChannel 
       Public SmtpIp As String
       Public FromAddress As String
       Public ToAddress As String

Public Async Sub Send(message As Message) Implements INotificationChannel.Send
       Await New Email().Send()
End Sub
End Class

Public Class SmsNotificationChannel: Implements INotificationChannel
        Public Sub Send(message As Message) Implements INotificationChannel.Send
             'Real Sms method to be immplemented here, right now Console for testing
              Console.WriteLine("Sending sms")
        End Sub
End Class

Теперь имея некоторый определенный класс, как это:

Public Class SpecificClass

      Public NotificationChannelEngine As INotificationChannelEngine

      Sub New(notificationengine As INotificationChannelEngine)
            NotificationChannelEngine = notificationengine
      End Sub

      Public Sub Encode(whatever As String)
           DoSomething1()
           DoSomething2()
           DoSomething3()
      End Sub

      Public Sub DoSomething1()
           'Some operation 1
           NotificationChannelEngine.Process(New Message() With {.Text = "DoSomething1 --> Some operation 1"})

           'Some operation 2
           NotificationChannelEngine.Process(New Message() With {.Text = "DoSomething1 --> Some operation 2"})
       End Sub

       Public Sub DoSomething2()
           'Some operation 1
           NotificationChannelEngine.Process(New Message() With {.Text = "DoSomething2 --> Some operation 1"})

           'Some operation 2
           NotificationChannelEngine.Process(New Message() With {.Text = "DoSomething2 --> Some operation 2"})
        End Sub

        Public Sub DoSomething3()
            'Some operation 1
            NotificationChannelEngine.Process(New Message() With {.Text = "DoSomething3 --> Some operation 1"})
        End Sub

End Class

Этот класс используется, чтобы быть использованы в конкретных классах:

Public Class NotificationChannelEngine :Implements INotificationChannelEngine

      Private ReadOnly _notificationChannels As IList(Of INotificationChannel)

      Sub New()
          _notificationChannels = New List(Of INotificationChannel)
      End Sub


      Public Sub RegisterNotificationChannel(channel As INotificationChannel)
          _notificationChannels.Add(channel)
      End Sub

      Public Sub Send(message As Message) Implements INotificationChannelEngine.Process
          For Each channel In _notificationChannels
              channel.Send(message)
          Next
      End Sub
End Class

Тест, чтобы увидеть, на какой-то конкретный класс пример:

Module Module1

Sub Main()
        Dim notificationChannel As New NotificationChannelEngine
        With notificationChannel
            .RegisterNotificationChannel(New MailNotificationChannel With {.SmtpIp = "192.168.0.1", .FromAddress = "from@email.com", .ToAddress = "to@email.com"})
            .RegisterNotificationChannel(New SmsNotificationChannel)
            .RegisterNotificationChannel(New FileNotificationChannel() With {.Path = "C:\Users\HP\Desktop\Log.txt"})
        End With

        Call New SpecificClass(notificationChannel).Encode("New Video")
        Call New SpecificOtherClass(otherNotificationChannel).Encode("New Video")
        Console.ReadLine()
End Module


96
2
задан 22 марта 2018 в 09:03 Источник Поделиться
Комментарии