在没有魔术字符串的情况下将屏幕去耦

Cat*_*ICU 6 c# architecture wpf mvvm magic-string

我的WPF项目将按如下方式组织:

Screens
   Group1
      Screen1
         View.xaml
         ViewModel.cs
   Group2
      Screen2
         View.xaml
         ViewModel.cs
Run Code Online (Sandbox Code Playgroud)

要显示Screen1来自Screen2我将使用这样的东西:ScreenManager.Show("Group1.Screen1")这在Screens.Group1.Screen1View和ViewModel 的命名空间中查找(使用反射)并实例化它们.

我怎样才能消除魔法字符串,不耦合Screen1Screen2(我不想班Screen2使用的Screen1命名空间).我也想要一些屏幕发现(自动完成/智能感知)

或者可能采用某种方式(自动化测试)来验证所有调用ScreenManager.Show是否有效.

更新: 我想出了这个:

public class ScreenNames
{
    public Group1Screens Group1;

    public class Group1Screens
    {
        public ScreenName Screen1;
    }
}

public sealed class ScreenName
{
    private ScreenName() { }
}

public class ScreenManager : IScreenManager
{
    public void Show(Expression<Func<ScreenNames, ScreenName>> x) {}
}
Run Code Online (Sandbox Code Playgroud)

用法:

screenManager.Show(x=>x.Group1.Screen1);
Run Code Online (Sandbox Code Playgroud)

不理想,但我认为违反DRY仍然比魔术弦更好.我可以自动测试(通过反射)所有调用都是有效的.

Cat*_*ICU 0

最后我使用 T4 代码生成来生成我的ScreenNames类。我通过调整以下代码来做到这一点:AutogeneratestrongtypednavigationclassforallusercontrolsinASP.NETwebapplication