C# 结构化程序导航

C# 结构化程序导航,c#,wpf,caliburn.micro,C#,Wpf,Caliburn.micro,我正在开发一个WPF应用程序,我使用Caliburn Micro来处理MVVM管道。我使用CM中的事件聚合器来侦听导航事件。目前,这些事件之间没有任何共同之处。所以我有一个OrderNavigationEvent、QuoteNavigationEvent、PriceBookNavigationEvent等等 我考虑在几个枚举中创建一个通用的NavigationEvent类,这些枚举具有我需要的所有不同类型的导航事件。比如: public enum NavigationDestinations {

我正在开发一个WPF应用程序,我使用Caliburn Micro来处理MVVM管道。我使用CM中的事件聚合器来侦听导航事件。目前,这些事件之间没有任何共同之处。所以我有一个OrderNavigationEvent、QuoteNavigationEvent、PriceBookNavigationEvent等等

我考虑在几个枚举中创建一个通用的NavigationEvent类,这些枚举具有我需要的所有不同类型的导航事件。比如:

public enum NavigationDestinations
{
    Orders,
    Quotes,
    PriceBook
}

public enum NavigationOptions
{   
    Open,
    New,
    Listing
}

public class NavigationEvent
{
    public NavigationDestinations NavigationDestination {get; set;}
    public NaviationOptions NavigationOption {get; set;}
    public int Id {get; set;}
}
然后我可以设置一个句柄(NavigationEvent消息),它可以归结为一个庞大的IF语句集合。它会起作用,但是


对我如何处理这个问题有什么建议吗

我不建议创建一个事件类的“基本”类,该类中没有公共性。你违反了单一责任原则。无论何时发布,您的三个事件都需要做一些不同的事情

我建议将它们分开,并调用_eventAggregator.Publish(class)到一个类中,让订阅者从中订阅

如果您需要在一个类中使用其中的三个事件,请执行三个
IHandle、IHandle、IHandle

并让类订阅eventAggregator.subscribe(this)
到它,然后您将消除多重IF检查,当某个事件发布时,您可以专注于某个功能

然后,每个事件都有三个不同的句柄

public void Handle(QuoteNavigationEvent eventArgs)
{
  ...
}

public void Handle(OrderNavigationEvent eventArgs)
{
 ...
}

public void Handle(PriceBookNavigationEvent eventArgs)
{
 ...
}

你描述的设置正是我现在所拥有的。我不喜欢它(除了一公吨的IHandles)的主要原因是我想像浏览器一样实现前向/后向导航。我不确定我将如何采取我目前的设置上面,并避免有一些值得一提的日常WTF。实际上,这是很容易的,因为向后/向前。我认为接口是继承树的一部分,我必须将对象从INavigationHistory转换回其原始事件。但我没必要这么做!等等,如果你想实现一个向前/向后导航的浏览器,为什么不使用页面控件呢?它给了你。。