2013-12-06 1 views
3

У меня есть класс Listener для прослушивания определенного HTTP-порта. Я сделал Listener singleton (так как всегда будет один объект прослушивателя, прослушивающий определенный порт). Для этого я сделал по умолчанию Listener() contructor private. Made Listener пример (внутри Listener класс) static и есть static Listener конструктор initialize singleton Listener объект. Также есть static Listener getListener(), который возвращает экземпляр singleton Listener.Передача параметров одиночному классу/статическому конструктору

Я получаю SOAP на этом порту, который обрабатывает метод обратного вызова моего слушателя.

Теперь я хочу, чтобы дата последнего уведомления была нажата на мой интерфейс.

Так что я думал, что как-то во время инициализации Listener я передать делегат, ссылка на который будет храниться внутри Listener, а затем каждый раз, когда я получаю уведомление, внутри слушателя обратного вызова я буду называть этот делегат и передать его текущее время (new DateTime()), который будет выполнять необходимую задачу печати сообщения со временем. Я также подумал о том, чтобы сделать параметр делегата необязательным, чтобы, если делегат null, он вообще не будет вызываться при уведомлении. Однако, поскольку я сделал конструктор закрытым, я не могу понять, как я могу передать ему делегат.

Чтобы обобщить и обобщать весь вопрос: Как передать параметр (который будет храниться как член экземпляра) в singleton class?

Должен ли я передать делегат getListener()? и внутри он проверяет каждый раз, если делегат имеет значение null, а если нет, задайте его? Но если я получаю доступ к этому объекту singleton слишком много раз, вызывая Listener.getListener(), каждый раз он будет излишне проверять делегат null. На самом деле именно поэтому я перевел инициализацию Listener на статический конструктор, чтобы избежать проверки, инициализируется ли Listener каждый раз, когда вызывается getListener().

Что нужно сделать, чтобы передать параметр в класс singleton? Или это проверяется в getListener() неизбежным?

Примечание: я не знаю, но этот вопрос может сводиться к тому, как мы можем передать параметры статического конструктора, так как мы должны инициализировать вещи в первый раз используется класс, и мы должны инициализировать его с делегатом/другим (поэтому мы не можем загружать параметры инициализации из некоторого файла конфигурации внутри статического конструктора).

+0

Почему бы не поднять событие из класса singleton, которое уведомляет пользовательский интерфейс о последнем времени запроса? или иметь свойство, которое всегда задано этому значению, которое может быть запрошено в потоке пользовательского интерфейса. – Kami

+0

событие повышения означает повторный вызов обратного вызова, который будет только делегировать - я полагаю, и установка значения означает, что поток пользовательского интерфейса для выполнения опроса - может не отражать обновления немедленно? – Mahesha999

+0

События являются делегатами по существу; поэтому он не будет более облагаться налогом, а затем вызовет делегата, переданного методу. Кроме того, поскольку делегат связан с объектом, было бы проще добавить несколько событий в событие. Рассмотрим шаблон наблюдателя - http://msdn.microsoft.com/en-us/library/ee817669.aspx – Kami

ответ

0

Просто добавьте нормальное событие в одноплодный класс:

public class Listener 
{ 
    //declare a delegate for the event 
    public delegate void InformationDelegate(DateTime timestamp); 

    //declare the event using the delegate 
    public event InformationDelegate Information; 

    public void SomeFunction() 
    { 
    // do something... 
    if(Information != null) 
    { 
     Information(DateTime.Now); 
    } 
    } 

    // singleton handling etc... 
} 

Тогда каждый объект, который хочет получить информацию регистрирует себя на одноплодном например:

class SomeUIClass 
{ 
    void AFunction() 
    { 
    Listener.Instance.Information += InformationHandling; 
    } 

    public void InformationHandling(DateTime timestamp) 
    { 
    // do something with the information 
    } 
} 

Благодаря @Kami для выяснения тема!

+0

Да, это единственный вариант, а также предпочтительный вариант, я думаю – Mahesha999

 Смежные вопросы

  • Нет связанных вопросов^_^