6

您好我正在尝试在 WPF MVVM 应用程序中使用 Unity 容器。我没有使用棱镜,因为它似乎很重。这是应用程序结构。我试图弄清楚如何将视图解析为 ViewModels 和视图模型(服务)的依赖关系。

应用:

意见

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

视图模型

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

我在每个视图模型中都有用于服务的 getter setter 属性。

我遇到了如何将依赖注入与 WPF 一起使用的问题,尤其是对于 Views 和 ViewModel。我尝试使用 Unity 在运行正常的控制台应用程序中注册和解析。但我想要一些关于如何为 WPF 应用程序完成此操作的想法。我试过注册

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

并使用 container.Resolve(); 解决它

但我不确定如何判断哪个视图必须使用哪个视图模型并在需要时解决它们,而不是在应用程序启动时解决它们。另外,我不解决应用程序启动中的所有映射。应在选择菜单(选择客户查看详细信息、选择图书查看详细信息、保存客户、预订图书等)时完成。

我读到的大部分内容都想使用 IView 和 IViewModel。但不确定我是否理解它的优势。

任何帮助是极大的赞赏。

4

1 回答 1

12

这是您可以做到这一点的一种方法。首先,使用 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有什么优点,我觉得有很多。仅举几例:促进组件之间的松散耦合并提高可测试性。我觉得这是一个好的设计/实现的关键。

更新:

使用 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 回答