私は私のViewModel にSaveFileDialogを使用していた、しかし、それはViewModelにから見ると結合を修正していないことから、私はそれを行うための方法を探しました。(WPF/MVVM)IServiceとViewModelの違いは何ですか?
public interface IOService
{
void IMessageBox(string Message);
string ISaveFileDialog(string DefaultPath);
}
public class IDialog : IOService
{
public void IMessageBox(string Message)
{
System.Windows.MessageBox.Show(Message);
}
public string ISaveFileDialog(string DefaultPath)
{
System.Windows.Forms.SaveFileDialog dg = new SaveFileDialog
{
InitialDirectory = DefaultPath,
Filter = "PDF files (*.pdf) | *.pdf"
};
dg.ShowDialog();
if (dg.FileName == null)
dg.FileName = string.Empty;
return dg.FileName;
}
}
は、彼らはそれがからビューを分離する使用して、これはサービスである、と言ったと。しかし、私はこのようなビューフォームのViewModel完全に分離しないいくつかの答えを見つけましたViewModel。しかし、我々はのViewModelにこのからインスタンスを作成している:
IDialog iDialog = new IDialog();
だから私は知りたい、この方法と、直接のViewModelからメッセージボックスまたはSaveFileDialogを呼び出す間diffrenceは何ですか?
注:はまた、私は、私は上記のようなサービスを利用することができると言いました何かを見つける、しかし、このようにそれを実装:
public class ExportViewModel : BaseViewModel
{
IOService _IOService;
public ExportViewModel(IOService ioservice)
{
_IOService = ioservice;
.
.
}
}
しかし、私はIOServiceの送る方法がわかりませんExportViewModelにインスタンスのインスタンスを作成できないため、!
これはテストの問題であり、VMからVを分離するものではありません。だから私は単体テストを使わないので、MessageBox.Show()を使ってMVVMに違反しないでください。 – Mostafa
@Mostafaユニットテストは1つのケースです。もう一つのケースは、今日はMessageBoxを使いたい、明日はMyCoolDialogを使いたいということなので、大規模な検索と置換の代わりに実装クラスを取り替えるだけです。 MVVMを使用している場合は、すでにDIを使用しているはずです。単純なインターフェースを定義し、実装にMessageBoxを貼り付けてください。それはあなたの将来を突き詰めるでしょう。 – SledgeHammer
ありがとう、しかし、私はどのようにインターフェイスがそれを行うことができるか分からない!私の質問の2番目の部分はまさにこれでした。インターフェイスには初期化メソッドがいくつか含まれています。実装ではありません。したがって、このインターフェイスを使用する各クラスでは、メソッドの本体を定義する必要があります。それはまったく役に立ちません。私はちょうどクラスを書くことができます(上記のIDialogのように)、すでにメソッドを使っています! – Mostafa