6

こんにちは私はWPFMVVMアプリケーションでUnityコンテナーを使用しようとしています。重いように見えるので、私はプリズムを使用していません。アプリケーションの構造は次のとおりです。ビューをViewModelsに解決する方法と、ビューモデル(サービス)の依存関係を理解し​​ようとしています。

応用:

ビュー

MainWindow.xaml
CustomerList.xaml
CustomerDetail.xaml
BookList.xaml
BookDetail.xaml

ViewModels

MainViewModel

CustomerListViewModel

BoolListViewModel

BookDetailViewModel

CustomerDetailViewModel

としょうかん

ICustomerService (AddCustomer, SaveCustomer, GetCustomers, GetCustomer)

CustomerService:ICustomerService

IBookService (GetBooks, GetBook)

BookService:IBookService

IBookReserveService(Reserve, Return)

BookReserveService:IBookReserveService
  1. MainViewModelには、ICustomerServiceおよびIBookServiceへの参照が必要です

  2. CustomerListViewModelにはICustomerServiceへの参照が必要です

  3. BoolListViewModelにはIBookServiceへの参照が必要です

  4. BookDetailViewModelには、ICustomerServiceおよびIBookReserveServiceへの参照が必要です。

  5. CustomerDetailViewModelには、ICustomerServiceおよびIBookReserveServiceへの参照が必要です

各ビューモデルのサービスにゲッターセッタープロパティがあります。

特にViewsとViewModelに対して、WPFで依存性注入をどのように使用するかについて問題が発生しています。Unityを使用して、正常に動作しているコンソールアプリケーションに登録して解決しようとしました。しかし、WPFアプリでこれをどのように行うことができるかについていくつかのアイデアが欲しいです。登録してみました

 container.RegisterType<ICustomerService, CustomerService>()
 container.RegisterType<IBookReserveService, BookReserveService>()
 container.RegisterType<IBookService, BookService>()

そしてcontainer.Resolve();を使用してそれを解決します。

しかし、どのビューがどのビューモデルを使用する必要があるかを判断し、アプリの起動時ではなく、必要に応じてそれらを解決する方法がわかりませんでした。また、アプリの起動時にすべてのマッピングを解決するわけではありません。メニュー(詳細を表示する顧客の選択、詳細を表示する本の選択、顧客の保存、本の予約など)が選択されているときに実行する必要があります。

私が読んだもののほとんどは、IViewとIViewModelを使用したかったのです。しかし、その利点を理解したかどうかはわかりません。

どんな助けでも大歓迎です。

4

1 に答える 1

12

これを行う1つの方法があります。まず、ビューモデルとサービスを次のようにUnityに登録します。

// Unity is the container
_container.RegisterType<IMainViewModel, MainViewModel>();
_container.RegisterType<IBookService, BookService>();

次に、次のように、ビューのコンストラクターでビューのDataContextをビューモデルに設定します。

public partial class MainView:UserControl
{
   private readonly IUnityContainer _container;

   public MainView(IUnityContainer container)
        {
            InitializeComponent();
            _container = container;   
            this.DataContext = _container.Resolve<IMainViewModel>();            
        }      
}

第三に、ビューモデルにサービスを注入する必要があります。

public MainViewModel(ICustomerService custService, IBookService bookService ){}

.configファイルなどを使用してこれを行う方法は他にもありますが、これで十分に始めることができます。さらに必要な場合はお知らせください。DIのメリットは何なのかとおっしゃっていましたが、たくさんあると思います。いくつか例を挙げると、コンポーネント間の緩い結合を促進し、テスト容易性を向上させます。これは、優れた設計/実装の要の1つだと思います。

アップデート:

Unity> = 3の場合、次のような命名規則に従うと、コンテナー登録をスキップできます。

// This will register all types with a ISample/Sample naming convention 
            container.RegisterTypes(
                AllClasses.FromLoadedAssemblies(),
                WithMappings.FromMatchingInterface,
                WithName.Default);
于 2012-11-20T19:36:17.637 に答える