在 Castle Windsor 中注册同一接口的多个实现
Register multiple implementations of same interface in Castle Windsor
假设我的组件当前对我的接口有单一依赖性 ICache
并且使用构造函数注入注册到基于数据库的缓存实现。像这样:
container.Register(Component.For<ICache>()
.ImplementedBy<DatabaseCache>()
.LifeStyle.Singleton
.Named("dbcache"));
然后我的组件注册它:
container.Register(Component.For<IRepository>()
.ImplementedBy<CoolRepository>()
.LifeStyle.Singleton
.Named("repo")
.DependsOn(Dependency.OnComponent(typeof(ICache), "dbcache")));
但是,如果我希望我的组件能够同时使用另一个 ICache
不同类型的依赖项怎么办?如何将同一接口的 2 个不同实现注入到主要组件中?
使用接受字符串作为第一个参数的 Dependency.OnComponent
的重载。这是将为其提供依赖项的构造函数中参数的名称。例如,如果您的 CoolRepository
构造函数如下所示:
public CoolRepository(ICache first, ICache second)
{
// ...
}
那么您的注册将如下所示:
// register another cache
container.Register(Component.For<ICache>()
.ImplementedBy<DummyCache>()
.LifeStyle.Singleton
.Named("otherCache"));
container.Register(Component.For<IRepository>()
.ImplementedBy<CoolRepository>()
.LifeStyle.Singleton
.Named("repo")
.DependsOn(Dependency.OnComponent("first", "dbcache"))
.DependsOn(Dependency.OnComponent("second", "otherCache")));
查看更多详情here。
假设我的组件当前对我的接口有单一依赖性 ICache
并且使用构造函数注入注册到基于数据库的缓存实现。像这样:
container.Register(Component.For<ICache>()
.ImplementedBy<DatabaseCache>()
.LifeStyle.Singleton
.Named("dbcache"));
然后我的组件注册它:
container.Register(Component.For<IRepository>()
.ImplementedBy<CoolRepository>()
.LifeStyle.Singleton
.Named("repo")
.DependsOn(Dependency.OnComponent(typeof(ICache), "dbcache")));
但是,如果我希望我的组件能够同时使用另一个 ICache
不同类型的依赖项怎么办?如何将同一接口的 2 个不同实现注入到主要组件中?
使用接受字符串作为第一个参数的 Dependency.OnComponent
的重载。这是将为其提供依赖项的构造函数中参数的名称。例如,如果您的 CoolRepository
构造函数如下所示:
public CoolRepository(ICache first, ICache second)
{
// ...
}
那么您的注册将如下所示:
// register another cache
container.Register(Component.For<ICache>()
.ImplementedBy<DummyCache>()
.LifeStyle.Singleton
.Named("otherCache"));
container.Register(Component.For<IRepository>()
.ImplementedBy<CoolRepository>()
.LifeStyle.Singleton
.Named("repo")
.DependsOn(Dependency.OnComponent("first", "dbcache"))
.DependsOn(Dependency.OnComponent("second", "otherCache")));
查看更多详情here。