我应该创建带有空构造函数的窗口实例

时间:2017-04-21 13:02:36

标签: c# wpf

我有一种情况,在解决方案中有两个项目。控件库和主应用程序。

现在我想创建将处理对话框初始化的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();
}

我想知道这是一个好习惯还是你知道更好的方法?

2 个答案:

答案 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接口。

希望它有所帮助。