我正在处理一个问题。想象一下这个示例情况。我有一个模块,例如带有注入 IUserRepository 的 UserModule。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 反模式的工厂模式,我只想通过容器配置来实现这一点。
我正在使用 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 容器的经验吗?您/哪个功能如何解决此问题?