wpf - 导入具有特定参数的类

标签 wpf mvvm dependency-injection mef

我有一个ViewModel,可以通过MEF导出。我希望此ViewModel每次导入时都根据将提供给它的枚举/特定对象参数以不同的方式初始化。

我已经阅读了一些有关该主题的文章,发现也许是这样-

http://msdn.microsoft.com/en-us/library/ee155691.aspx#metadata_and_metadata_views

可以满足我的需求,但是我不确定这是否是最好的方法。

我一直在考虑的另一种方法是正常导入类,然后在实例化后调用一个特殊的初始化方法来接收我的参数。但是,这似乎不是经典的MEF实现,并且可能会失去一些“魔力”。

我希望有人能够为我指出实现此目标的推荐方法。

谢谢!

最佳答案

解决方法是导出创建您类型实例的工厂。虽然这意味着您不能直接导入这些实例,但这样做的好处是创建实例的逻辑是工厂的责任,因此该类的用户不必了解它:

public class ServiceWithParameter
{
  public ServiceWithParameter( int a )
  {
    this.a = a;
  }

  private readonly int a;
}

[Export]
public class ServiceWithParameterFactory
{
  public ServiceWithParameterFactory()
  {
    instance = 0;
  }

  public ServiceWithParameter Instance()
  {
    return new ServiceWithParameter( instance++ );
  }

  private int instance;
}

  //now everywhere you need ServiceWithParameter:
[Import]
ServiceWithParameterFactory serviceFactory;

var instanceA = serviceFactory.Instance(); //instanceA.a = 0
var instanceB = serviceFactory.Instance(); //instanceB.a = 1

一种更可扩展的方式是告诉容器您有一家工厂,并在此处提供示例:http://pwlodek.blogspot.com/2010/10/mef-object-factories-using-export.html

关于wpf - 导入具有特定参数的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8550681/

相关文章:

c# - 在 ASP.NET MVC 3 中在哪里初始化 ObjectFactory?

wpf - PathGeneratedInternally 标志在 WPF 绑定(bind)中的作用是什么?

c# - 对目录文件进行排序并获取最高的文件名

java - 如何在不在构造函数中指定的情况下使用 Mockito 注入(inject)字段?

c# - 根据 subview 模型更改 wpf 单页应用程序中的 View

c# - ObservableCollection 条件计数

angularjs - 如何使用 ES6 注入(inject) Angular 类

wpf - 使用 Horizo​​ntalContentAlignment 属性将文本与 ContentControl 对齐

c# - CheckBox 模板中的选中状态未更新

wpf - 如何根据我的 subview 模型的类型切换 Telerik 功能区 View 元素?