我有一个“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();
答案 0 :(得分:2)
您可以使用类似“{更新”或“已删除”(枚举)等DataImporterProgress
属性创建Action
事件,并使用Message
字符串eventArgs
} property。
答案 1 :(得分:0)
我认为保持事件专用是一件好事,只要它们提供相应的基础结构(例如,DataImporterCompleted的事件args不再提供,DataImporterImportedData将提供刚刚导入的行列表)
除此之外,如果你想要只有一些状态字符串的非常简单的功能,你可以做类似的事情:
public event Action<string> StatusUpdate;
你举起来:
StatusUpdate("some status string");
您的处理程序将如下所示:
void HandleStatusUpdate(string status)
或者您可以使用标准的.NET模式:
class MyEventArgs: EventArgs {}
public event EventHandler<MyEventArgs> MyEvent;
等等......
答案 2 :(得分:0)
正如亚当已经提到的那样,为其他课程区分这些事件会更容易,因为每个听众只会收到他喜欢的这类事件。但是如果你认为订阅这些事件之一的每个人都必须订阅所有这些事件,那么制作这么多不同的事件是没有意义的。
如果您想合并它们,那么您就可以自己动手了。但也许你可以从INotifyPropertyChanged
和ListChanged
事件中获得一些灵感,因为它们也是某种可能发生的不同类型事物的聚合器。但这导致客户端必须检查来自事件的传入数据,并且可能会丢弃大量传入的事件,因为它们没有兴趣。
答案 3 :(得分:0)
我也会按照其他答案的建议将它们分开。
为避免重复处理代码,您可以使用兼容的签名设置事件。这将允许您向所有事件注册相同的事件处理函数。
我不知道你的情况是否合理。这取决于具体情况。
答案 4 :(得分:0)
解决方案涉及使用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));
还有更多......