2

既存のアプリケーションに少し拡張機能を実装しています。現在、mvvm を使用して「wpf-library」を作成していますが、現時点ではすべてがうまくいっているようです。

ここで、基になるデータベースからいくつかのデータセットを削除するイベントがあるとします。拡張アプリではなく、呼び出し元アプリケーションでこれを行いたいです。

だから私が達成したこと(そして何がうまくいったか)は、ユーザーが私の「削除」ボタンをクリックし、ビューモデルがコマンドを実装し、ここでイベントを発生させることができるということです。私が望んでいたのは、イベントを呼び出し元のアプリケーションに送信することです。

呼び出し元アプリが次のように表示できるようになった私のスタートアップ クラス:

    public UserControl ViewToShowInContainer { get; private set; }

    public StartMyExtensionApplication(Model.TransportClass dataToWorkWith)
    {
        ViewToShowInContainer = new View.MainView();
        (ViewToShowInContainer.DataContext as VehicleSearchWPF.ViewModel.MyMainViewModel).RemoveSelectStatementFromDB += new EventHandler<SelectStatementRemovedEventArgs>(StartVehicleSearch_RemoveSelectStatementFromDB);
        LocalDataToWorkWith.MapTransportClass(dataToWorkWith);
    }

    void StartVehicleSearch_RemoveSelectStatementFromDB(object sender, SelectStatementRemovedEventArgs e)
    {
        throw new NotImplementedException();
    }

しかし、私の意見では、これを実装するためのより良い/よりクリーンな/より良い方法が必要ですか?

前もって感謝します!:)

4

1 に答える 1

1

これは実際、通常のイベントを使用するのに適切な場所ではないようです。いくつかの他のオプション:

-イベントを使用せずに「サービス」を使用します。デカップリングしながら、より明確で直接的です。データベース サービスをモックすることで、ビューモデルを簡単にテストできるという利点があります (たとえば、Remove コマンドを実行すると、データベースで Remove が効果的に呼び出されることをテストします)。

  //a database interface
public interface IDataBase
{
  public void Remove( string entry );
  //etc
}

  //a concrete database
public class SqlDataBase : IDataBase
{
  //implementation of IDataBase
}

  //vm uses an IDataBase
class VehicleSearchViewModel
{
  public VehicleSearchViewModel( IDataBase dataBase );

  private void Remove( string id )
  {
    dataBase.Remove( id );
  }
}

  //so main app can pass it
public StartMyExtensionApplication( .... )
{
  var dataBase = CreateDataBase( .... );
  view.DataContext = new VehicleSearchViewModel( dataBase );
}

- Prism の IEventAggregator のようなものを使用する

class VehicleSearchViewModel
{
  public VehicleSearchViewModel( IEventAggregator aggr );

  private void Remove( string id )
  {
    aggr.Publish( new RemoveFromDBEvent{ id = id } );
  }
}

public StartMyExtensionApplication( .... )
{
  aggr.Subscribe<RemoveFromDBEvent>( DoRemove );
}

private void DoRemove( RemoveFromDBEvent evt )
{
  dataBase.Remove( evt.id );
}
于 2012-06-26T07:37:21.387 に答える