Есть ли приемлемое «имя» для события, которое просто сообщает «сообщение» - PullRequest
0 голосов
/ 18 августа 2011

У меня есть класс «DataImporter» [берет данные из многих источников и обрабатывает их], о котором я хочу сообщить через событие, когда оно «что-то делает». На данный момент у меня есть: DataImporterStarted DataImporterCompleted DataImporterImportedData DataImporterDeleted

Но все они делают одно и то же ... сообщают простую строку, в которой говорится "Импорт данных начался в xx: xx" или "Импортированные DataImporter строки xxx" и т. Д.

Должен ли я хранить события отдельно, или существует ли принятая схема шаблонов / именования для такого рода событий "Я делаю что-то"? Thx

Я пытался избежать такого кода:

var importer = new DataImporter();
importer.DataImporterStarted += new DataImporterStartedEventHandler(importer_DataImporterMessage);
importer.DataImported += new DataImportedEventHandler(importer_DataImporterMessage);
importer.DataImporterCompleted += new DataImporterCompletedEventHandler(importer_DataImporterMessage);
importer.RunDataImporter();

Ответы [ 5 ]

2 голосов
/ 18 августа 2011

Вы можете использовать что-то вроде создания события DataImporterProgress со свойством Action, например, "Обновлено" или "Удалено" (перечисление), и строкой Message в свойстве eventArgs.

0 голосов
/ 18 августа 2011

События довольно тяжелый вес для этого короля задач, особенно если частота высокая. Хотя я не отвечаю на ваш вопрос напрямую, я хочу дать вам альтернативу решению, основанному на событиях:

Решение включает в себя потоки событий с использованием Rx Framework и предоставление и IObservable (T) вместо события.

Решение выглядит следующим образом: класс DataImporter предоставит свойство IObservable<string>, которое внутренне реализуется с помощью Subject<T>, который будет использоваться для вызова событий.

public class DataImporter {
    private Subject<string> _StatusSubject = new Subject<string>();
    public IObservable<string> Status { get { return _StatusSubject; }
    ...
}

Как вызвать событие в потоке:

void Foo() 
{
    // Do some work
    _StatusSubject.OnNext("Some work has been done!")    
}

Как подписаться на поток событий:

var importer = new DataImporter();
importer.Status.Subscribe(message => Console.WriteLine(message));

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

// Filter the stream of events, only to show short messages
importer.Status
        .Where (message => message.Length < 100)
        .Subscribe(message => Console.WriteLine(message));    

// Add a timestamp to status messages
importer.Status
        .TimeStamp()
        .Subscribe(timestamped => Console.WriteLine(String.Format("Time:{0} Message: {1}", timestamped.Timestamp, timestamped.Value)));    

// Buffer status messages each 5 secconds and return a list of messages
importer.Status
        .BufferWithTime(Timespan.FromSeconds(5))
        .Subscribe(list => Console.WriteLine(Strin.Join(new[] {Environment.Newline}, list));

и многое другое ...

0 голосов
/ 18 августа 2011

Я бы держал их отдельно, как предлагалось и в других ответах.

Чтобы избежать дублирования кода обработки, вы можете настроить события с совместимыми подписями. Это позволит вам зарегистрировать одну и ту же функцию-обработчик для всех событий.

Я не знаю, имеет ли это смысл в вашем случае. Это зависит от контекста.

0 голосов
/ 18 августа 2011

Как уже упоминал Адам, было бы легче различить эти события для других классов, потому что каждый слушатель получит только те виды событий, которые ему нравятся.Но если вы думаете, что каждый, кто подписывается на одно из этих событий, должен подписаться на все из них, то не имеет смысла делать такие разные события.

Если вы хотите объединить их, выпо своему усмотрению.Но, может быть, вы можете получить вдохновение от событий INotifyPropertyChanged и ListChanged, потому что они также являются своего рода агрегаторами для различных вещей, которые могут произойти.Но это приводит к тому, что клиент должен проверять входящие данные о событии, а make, возможно, должен отбрасывать множество входящих событий, потому что они не представляют интереса.

0 голосов
/ 18 августа 2011

Я бы сказал, что было бы неплохо сохранять события специализированными, если они предоставляют соответствующую инфраструктуру (например, когда аргументы событий DataImporterCompleted не предлагают ничего более, DataImporterImportedData предоставляет список строк, которые были только что импортированы).

Кроме этого, если вам нужна чрезвычайно простая функциональность с какой-либо строкой состояния, вы можете сделать что-то вроде:

public event Action<string> StatusUpdate;

Вы поднимаете его с помощью:

StatusUpdate("some status string");

Ваши обработчики будут выглядеть так:

void HandleStatusUpdate(string status)

Или вы можете использовать стандартный шаблон .NET:

class MyEventArgs: EventArgs {}

public event EventHandler<MyEventArgs> MyEvent;

И так далее ...

...