在Castle Windsor中注册同一接口的多个实现

本文关键字:接口 实现 Castle Windsor 注册 | 更新日期: 2023-09-27 18:21:28

假设我有一个组件,该组件当前对接口ICache有一个依赖项,并且使用构造函数注入在基于DB的Cache实现中注册。类似这样的东西:

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依赖项,该怎么办?如何将同一接口的两个不同实现注入到主组件中?

在Castle Windsor中注册同一接口的多个实现

使用接受字符串作为第一个参数的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")));

点击此处查看更多详细信息。