0

私は1つの問題に取り組んでいます。この例の状況を想像してみてください。IUserRepository が注入された UserModule などのモジュールが 1 つあります。IUserRepository は、IUserRepositorySql や IUserRepositoryDe​​fault など、より多くの実装を持つことができます。

public class UserModule : IUserModule
{
    private readonly IUserRepository userRepository;

    public UserModule(IUserRepository userRepository)
    {
        if (userRepository == null) throw new ArgumentNullException("userRepository");
        this.userRepository = userRepository;
    }
}

UserModule で使用される IUserRepository の実装を定義したいと思います。Marc Seeman の本で IoC アンチパターンのように見なされる Factory パターンを避けたいのですが、これはコンテナー構成でのみ実現したいと考えています。

私は LightInject を使用しており、名前付きサービスのようなものがありますが、トップレベルでしか使用できません。私はこのようなものが必要です:

var container = new ServiceContainer();

container.Register<IUserRepository, UserRepositorySql>("Sql");
container.Register<IUserRepository, UserRepositoryDefault>("Default");
container.Register<IUserModule, UserModule>();

var instance = container.GetInstance<IUserModule>("Sql");

このコードは、注入された UserRepositorySql インスタンスを含む IUserModule のインスタンスを返す必要がありますが、もちろんそうではありません。

LightInjectでこれに対する解決策はありますか?

適切なタイプのいくつかのプロパティを挿入できるLightinjectの機能注釈を見つけましたが、このソリューションはあまり好きではありません。

他の IOC コンテナでの経験はありますか? この問題をどのように/どの機能で解決しますか?

4

2 に答える 2

1

Unity は、 ResolvedParameterクラスを使用してコンストラクター インジェクションを実行するときに使用する名前付きインスタンスの指定をサポートしていることを知っています(これは、架空の構築と同じように機能します)。

container.Register<IUserModule, UserModule>(
    new InjectionConstructor(
        new ResolvedParameter<IUserModule>("Sql")));

ただし、ほとんどの DI フレームワークはファクトリ メソッドもサポートしており、上記の例は Unity で次のように記述することもできます。

container.Register<IUserModule>(
    new InjectionFactory(cont => cont.Resolve<IUserModule>("Sql"));

この場合、IUserModule インスタンスを作成する必要があるときは常に式を使用するように Unity に指示し、その式では、コンテナを使用して特定のインスタンスを解決できます。

後者の構成は、DI フレームワークでも十分に可能であると思われます。

于 2014-09-08T17:53:28.590 に答える