0

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

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

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

我的问题如下:如何在维护 IoC 的同时获得IUserinside of的具体实现的实例(没有不知道具体实现的具体实现)?IArtist.Load()IArtistIUser

(为了简单起见,让我们调用CArtist的具体实现IArtist,以及CUser的实现IUser。)

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

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

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

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

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

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

4

1 回答 1

1

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

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 方面的专家确切地知道这是一个好还是坏的做法。

于 2013-11-13T22:01:46.513 回答