【问题标题】:IoC/MEF containerIoC/MEF 容器
【发布时间】:2013-11-13 13:19:12
【问题描述】:

在我的界面包中,当用户想要更改有关艺术家的某些信息时,我会运行以下代码:

IArtist artistToChange = ContainerHelper.Container.GetExportedValue<IArtist>();
artistToChange.Load(new Guid("provided guid"));
artistToChange.SomeProperty = newValue;
artistToChange.Update();

作为艺术家是我领域中的一个实体,它由必须加载的 IUser CreatedByIUser LastAlteredBy 属性组成(想想多对一关系)。每个实体也有自己的存储库。 IArtist 拥有一个 IArtistRepository,就像 IUser 拥有 IUserRepository 一样。

我的问题如下:如何在维护 IoC 的同时在 IArtist.Load() 中获取 IUser 的具体实现实例(没有 IArtist 的具体实现,不知道具体实现IUser)?

(为方便起见,我们将CArtist 称为IArtist 的具体实现,将CUser 称为IUser 的实现。)

考虑到这一点,我想将容器传递给 Entities 以便他们也可以请求部件,但我不知道这是一个好主意还是反模式,主要是因为我使用构造函数注入和我的“CArtist”构造函数看起来像这样:

[ImportingConstructor]
public CArtist(IArtistRepository repository)
{
    this.repository = repository;
}

但我不能让容器自己注入类似的东西

[ImportingConstructor]
public CArtist(IArtistRepository repository, CompositionContainer container)
{
    this.container = container    
    this.repository = repository;
}

所以基本上就是这样......我在这里很迷茫......结果证明这是一个寻求帮助/指导的呼声,而不是一个问题......

PS:如果需要任何其他信息,请询问!

【问题讨论】:

  • 您打算如何使用 CArtist 类中的容器?容器会比使用 ImportAttribute 修饰的属性更灵活吗?

标签: c# inversion-of-control mef ioc-container


【解决方案1】:

假设您正确导出具体的 IArtist 类,您可以在代码中执行以下操作,然后只要 dll 可用,当您编写 CArtist 类时,IArtist 类型将被注入进入课堂。您甚至可以使用私有变量 private IArtist _someArtist;(标有 import 属性)

public class CArtist : IArtist
{
    [ImportingConstructor]
    public CArtist(IArtistRepository repository)
    {
        this.repository = repository;
    }

    public void Load(Guid guid)
    {
        this.SomeArtist.DoSomething(guid);
        ...
    }

    [Import(typeof(IArtist))]
    private IArtist SomeArtist { get; set; }
}

另一种方法是,再次在类中使用属​​性或 var,并将其导入构造函数中

private IArtist _artist;

[ImportingConstructor]
public CArtist(IArtistRepository repository, IArtist artist)
{
    this.repository = repository;
    this._artist = artist;
}

除了那些可能的方法之外,恕我直言,通过容器不会有太大的问题,它会起作用,而且你仍然保持分离,我已经看到在几个地方这样做了,但我不是专家在 IoC 中明确知道这是一个好还是坏的做法。

【讨论】:

  • 有趣...到目前为止,我将容器放在库中(项目只有接口和枚举器),因为所有项目都引用它...我创建了一个帮助类,它将容器返回为单身人士...我认为这是一个很好的方法...你觉得呢?
  • @Leonardo 它会起作用,就像俗话说的那样,给猫剥皮的方法不止一种(请注意,在这个惯用的表达方式中实际上没有猫受到伤害)。虽然我个人不会采用这种方法,但恕我直言,客户应该负责编写所需的任何内容,而不是接口和枚举所在的共享库:)
猜你喜欢
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 2011-05-19
  • 2011-09-17
  • 2011-03-18
  • 1970-01-01
  • 2013-03-12
  • 2014-04-29
相关资源
最近更新 更多