mef 中导出两次是否指向同一个对象

发布于 2024-10-22 23:38:54 字数 129 浏览 0 评论 0原文

[Export]
[Export(typeof(IClass))
public Class : IClass

当我对 Class 和 IClass 使用构造函数注入时,我可以期待相同的单例吗?

[Export]
[Export(typeof(IClass))
public Class : IClass

Can I expect the same singleton when I use constructor injection for Class and IClass?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

相思碎 2024-10-29 23:38:54

是的,无论导出的数量如何,CreationPolicy.Shared 都是按类型指定的,这意味着作为 ExportExport(typeof( IClass))。您可以通过一个示例来了解这一点:

public interface IMyClass
{
  string Name { get; set; }
}

[Export]
[Export(typeof(IMyClass))]
public class MyClass : IMyClass
{
  private static int count;

  public MyClass()
  {
    count++;
    Name = "Instance " + count;
  }

  public string Name { get; set; }
}

var container = new CompositionContainer(
  new AssemblyCatalog(Assembly.GetExecutingAssembly()));

var instance1 = container.GetExportedValue<MyClass>();
var instance2 = container.GetExportedValue<IMyClass>();

// should be true.
bool referenceEquals = object.ReferenceEquals(instance1, instance2);

// should also be true.
bool nameEquals = instance1.Name == instance2.Name;

Yes, regardless of the number of exports, the CreationPolicy.Shared is specified per type, which means as the actual runtime type resultant of Export and Export(typeof(IClass)). You can see this with an example:

public interface IMyClass
{
  string Name { get; set; }
}

[Export]
[Export(typeof(IMyClass))]
public class MyClass : IMyClass
{
  private static int count;

  public MyClass()
  {
    count++;
    Name = "Instance " + count;
  }

  public string Name { get; set; }
}

var container = new CompositionContainer(
  new AssemblyCatalog(Assembly.GetExecutingAssembly()));

var instance1 = container.GetExportedValue<MyClass>();
var instance2 = container.GetExportedValue<IMyClass>();

// should be true.
bool referenceEquals = object.ReferenceEquals(instance1, instance2);

// should also be true.
bool nameEquals = instance1.Name == instance2.Name;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文