我有一种情况,在解决方案中有两个项目。控件库和主应用程序。
现在我想创建将处理对话框初始化的DialogFactory。
假设结构是这样的
Application.Presentation
- MainWindow.xaml
- ChartDialog.xaml(已编辑的名称)
Application.Presentation.Controls
- DateTimeDialog.xaml
- ColorPickerDialog.xaml
Flow就像这样: MainWindow 打开对话框 Window1 ,打开对话框 DateTimeDialog
我想创建两个项目都会引用的接口来处理对话框创建。
DialogFactory应如下所示:
public interface IDialogFactory<T> where T:Window
{
T FetchDialog();
void Release(T instance);
}
为此,所有Window / Dialog构造函数都应为空。 这意味着应该传递任何附加值 通过Init方法。
所以这个例子会像这样工作
MainWindow.xaml.cs :
openDialog_Click(...)
{
Window1 dialog = dialogFactory.FetchDialog<Window1>();
dialog.Init(arg1, arg2, arg3);
dialog.Show();
}
Window1.xaml.cs
openDialog_Click(...)
{
Control1 dialog = dialogFactory.FetchDialog<DateTimeDialog>();
dialog.Init(arg1);
dialog.ShowDialog();
}
我想知道这是一个好习惯还是你知道更好的方法?
答案 0 :(得分:2)
为什么不简单地实现一个处理对话框创建的DialogService
?
public interface IDialogService
{
void ShowDialog(string title, string message);
}
public class DialogService : IDialogService
{
public void ShowDialog(string title, string message)
{
//implement your actual dialog however you want there...
System.Windows.MessageBox.Show(message, title);
}
}
然后,您可以将所需的参数传递给ShowDialog
方法,并根据需要实现它。
对话服务不应来自Window
。它只是一种服务,其唯一目的是显示对话框。
最佳做法是使用IDialogService
实现视图模型类。然后,您可以使用在单元测试中不显示对话框的虚拟服务轻松替换实现。
答案 1 :(得分:1)
这样的事情怎么样。
public interface IWindowFactory
{
IWindow Get(IViewModel viewModel);
}
然后,您可以根据视图模型控制窗口或对话框的创建方式。您可以轻松地模拟它进行单元测试,您只需要了解IWindow
接口。
希望它有所帮助。