是否可以/有必要从处置方法之外的事件取消订阅?可能是错误的代码设计



我在这种情况下,我必须新建一个ViewModel,它有一个事件,并基于用户选择的视图,我可能需要在这个和其他具有相同界面的ViewModel之间来回交换,每次他们都必须获得更新的数据。这些ViewModel包含了我需要显示的ViewModel列表。

是否可以在通常的Dispose方法之外以这种方式分离和附加到事件?

if (_animalsListVm is not null)
{
_animalsListVm.MyEvent -= Handle_MyEvent;
}
_animalsListVm = MakeListViewModel();
_animalsListVm.MyEvent += Handle_MyEvent;
await _animalsListVm.InitializeAsync(); 

假定这段代码可能是混乱的,我正在使用Blazor,我试图找到一种替代的枚举或布尔值来显示组件,所以我决定根据当前ViewModel的具体类型切换视图。

在dispose方法之外附加和分离事件通常是可以的。

在某些情况下,这样的模式可能更可取:

public IDisposable RegisterForEvent(Action<EventArguments> eventHandler);

这遵循典型的处理模式。如果您需要在注册或取消注册事件时做一些工作,那么这种模式可能是更可取的。您可以对常规事件执行相同的操作,但我通常不希望事件注册执行任何耗时的工作。

然而,我不是初始化方法的粉丝。虽然它们很难避免,但我更喜欢在构造函数返回时完全构造的对象,例如:

_animalsListVm?.Dispose();
_animalsListVm = await MakeListViewModel(Handle_MyEvent);

相关内容

  • 没有找到相关文章

最新更新