System.Action <T>作为EventHandler

ben*_*asd 2 .net c# action func event-handling

相信使用委托System.Action或System.Func作为EventDelegates而不是经典的EventHandler模​​式.因此我会遇到问题吗?

private bool disposed;

public event Action<IUnitOfWork, IContext> Disposing;

public void Dispose()
{
    if (this.disposed)
    {
        return;
    }

    if (null != this.Disposing)
    {
        this.Disposing(this, this.AttachedContext);
    }

    this.disposed = true;
}
Run Code Online (Sandbox Code Playgroud)

-

用法:

unitOfWorkInstance.Disposing += (u, c) => c.Rollback(u); // in my opinion more readable than
unitOfWorkInstance.Disposing += (sender, args) => args.AttachedContext.Rollback(sender as IUnitOfWork);
Run Code Online (Sandbox Code Playgroud)

抱歉可怕的englisch

Jon*_*eet 6

那么,你在那里给出的代码不是线程安全的 - 有人可以在你的无效测试之后和你的电话之前取消订阅事件处理程序this.Disposing.

但总的来说,它应该工作得很好.缺点是,如果不遵循EventHandler惯例,您可以订阅的内容略有限制.

例如,假设您有一个非常通用的事件处理程序方法:

public void LogEvent(object sender, EventArgs e)
{
    Console.WriteLine("Event raised");
}
Run Code Online (Sandbox Code Playgroud)

您可以使用它来订阅遵循常规约定的任何事件 - 但不能使用您的事件.

这是一个相当小的缺点.我想一个可能更大的问题是它可能会混淆其他希望看到传统事件签名的开发人员.

编辑:我刚刚记得其他一些库可能会期望传统的事件签名 - 例如Reactive Extensions.IIRC,订阅其他活动并非不可能,只是有点困难.

  • 同意你所说的"这虽然是一个相当小的缺点" - 根据他们有多少控制,他们可以用lambda调整它:`unitOfWork.Disposing + =(uow,context)=> LogEvent(uow,new EventArgs的());`. (2认同)