MEF校准微型

时间:2012-11-12 14:43:46

标签: c# dependency-injection mef

我撞墙了。我添加了另一个具有Service类的程序集的引用。 所以我没有创建一个新实例,而是MEF会帮助(但不会)..我会做类似于HelloScreens示例的事情。以下viewmodel也接受一个属性来保存模型。(Staff)

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

    1. 使用内置Func委托类型,如上所示,您可以随时使用带有一个或多个输入参数的其他Func类型,因为您的子视图模型需要数据
    2. 创建特定的工厂界面和具体实现,并将其注册到容器
    3. 创建一个通用视图模型工厂并注入
    4. 有关选项3的示例,请参阅http://pglazkov.blogspot.co.uk/2011/04/mvvm-with-mef-viewmodelfactory.html

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