我的 WPF 项目将像这样组织:
Screens
Group1
Screen1
View.xaml
ViewModel.cs
Group2
Screen2
View.xaml
ViewModel.cs
为了显示Screen1
从Screen2
我将使用这样的东西:ScreenManager.Show("Group1.Screen1")
这在名称空间中查找(使用反射)Screens.Group1.Screen1
一个 View 和一个 ViewModel 并实例化它们。
如何在不耦合的情况下消除魔术字符串Screen1
和Screen2
(我不希望其中的类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) {}
}
用法:
screenManager.Show(x=>x.Group1.Screen1);
不理想,但我认为违反 DRY 仍然比魔术字符串好。而且我可以自动测试(通过反射)所有调用都是有效的。