0

我撞到了一堵墙。我添加了另一个具有服务类的程序集的引用。因此,尽管 MEF 会有所帮助(但不会),但我没有创建一个新实例。我做了类似于 HelloScreens 示例的事情。以下视图模型也接受一个包含模型的属性。(工作人员)

public class StaffFormViewModel : Screen
{
    [Import]
    public StaffService staffService { get; set; }

显然这不起作用,因为该类不是由 MEF 构建的。但即使我想用 mef 构建它,我也应该创建多个实例,所以我应该选择NonShared。但人们说它很慢。Caliburn 微示例添加了类似的内容以创建新实例。这需要每件事 5 行代码。

batch.AddExportedValue<Func<PreferencesCategoriesFormViewModel>>(
    () => container.GetExportedValue<PreferencesCategoriesFormViewModel>());

问题是,虽然我可以使用它,但如果我想在构造函数中提供一个模型类,我不能,因为它是由 MEF 构造的。我应该手动设置属性。我想要的只是注入所需的服务。这对mef不可能吗?我是否应该将容器公开静态以便我可以引用它并调用 compose?请帮忙 :)

4

1 回答 1

2

您提供的示例只是创建一个返回新实例的工厂PreferencesCategoriesViewModel。他们使用内置的委托类型Func来保存他们创建新的工厂接口,以及需要引用容器的接口实现。

因此,如果您希望通过 MEF 实例化视图模型,那么您可以:

  1. 如果您只需要视图模型的单个实例,则可以通过构造函数注入将其注入父视图模型,并让 MEF 实例化它
  2. 如果您需要控制视图模型的实例化,或者您需要实例化视图模型的多个实例,那么您可以将视图模型工厂类型注入父视图模型

如果您要使用视图模型工厂,那么您可以:

  1. Func使用如上所示的内置委托类型,您始终可以使用Func具有一个或多个输入参数的其他类型之一,因为您的子视图模型需要数据
  2. 创建特定的工厂接口和具体实现,并将其注册到容器中
  3. 创建一个通用视图模型工厂并注入它

有关选项 3 的示例,请参阅http://pglazkov.blogspot.co.uk/2011/04/mvvm-with-mef-viewmodelfactory.html

你会注意到他的视图模型工厂有一个对 MEF 容器的引用,他实际上是通过 MEF 解析的。因此,您的容器需要自行注册。

于 2012-11-13T23:50:19.257 回答