2012-11-12 59 views
0

我碰到了墙壁。我添加了具有Service类的另一个程序集的引用。 因此,而不是创建一个新的实例我虽然这MEF将有助于(但不会)的。我做一些类似HelloScreens sample.The以下视图模型的东西接受的属性也保存模型。(职员)MEF caliburn micro

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

显然,这不起作用,因为班级不是由MEF构建的。但是,即使我想与MEF我应该创建多个实例来构建它,所以我应该选择非共享。但人们说,它的缓慢。 Caliburn微示例添加了类似的东西,以创建新的实例。这需要每行5行代码。

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

的问题是,虽然如果我想以提供构造模型类我不能,因为它是由MEF建立我可以用这个呢。我应该亲自设置财产。 我只想要注入所需的服务。这不可能与mef?我应该公开静态的容器,所以我可以参考它,并呼吁撰写?请帮助:)

回答

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解决了这个问题。因此您的容器需要自行注册。

+0

谢谢,但我想注入一个服务类,而不是由mef构造的类 – GorillaApe

+0

同样的原则适用,它只是你的视图模型构造函数将会改变,或者你的工厂方法来获取它需要的数据。例如。你可以使用Func 或者创建一个接口类型和一个接受你的数据类型的方法。我链接到的视图模型工厂也支持参数。 – devdigital

+0

3看起来不错,因为cm解决方案对我来说很难看。所以工厂似乎是2或3的解决方案。 – GorillaApe