私は1つの問題に取り組んでいます。この例の状況を想像してみてください。IUserRepository が注入された UserModule などのモジュールが 1 つあります。IUserRepository は、IUserRepositorySql や IUserRepositoryDefault など、より多くの実装を持つことができます。
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 コンテナでの経験はありますか? この問題をどのように/どの機能で解決しますか?