0

私のインターフェースパッケージには、ユーザーがアーティストに関する情報を変更したいときに実行される次のコードがあります。

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

私のドメインのエンティティであるアーティストは、ロードする必要があるIUser CreatedBy&IUser LastAlteredByプロパティによって他のものと一緒に構成されます (多対 1 の関係を考えてください)。各エンティティには、独自のリポジトリもあります。IArtist には、 IUser と同じように IArtistRepository がありIUserRepositoryます。

私の問題は次のとおりです。IoCを維持しながら(の具体的な実装について知らないという具体的な実装なしで)内部の具体的な実装のインスタンスを取得するにはどうすればよいですか?IUserIArtist.Load()IArtistIUser

(簡単にするためにCArtist、 の具体的な実装IArtistCUserの実装を呼び出しましょう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;プライベート変数( 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 の専門家ではありません。それが良い習慣なのか悪い習慣なのかを明確に知ることができます。

于 2013-11-13T22:01:46.513 に答える