- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
考虑示例 C# 控制台应用程序中服务和组件的以下场景
public interface IService { }
public class FooService: IService { }
public class BarService: IService { }
public class BuzzService: IService { }
public class AwesomeService: IService { }
public class Consumer
{
public Consumer(IEnumerable<IService> services)
{
// do some initilization work here...
}
}
public class AnotherConsumer
{
public AnotherConsumer(IEnumerable<IService> services)
{
// do some initilization work here...
}
}
让我们想象在组合根中进行以下注册:
var container = new WindsorContainer();
container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel, true));
container.Register(Component.For<IService>().ImplementedBy<FooService>());
container.Register(Component.For<IService>().ImplementedBy<BarService>());
container.Register(Component.For<IService>().ImplementedBy<BuzzService>());
container.Register(Component.For<IService>().ImplementedBy<AwesomeService>());
container.Register(Component.For<Consumer>());
container.Register(Component.For<AnotherConsumer>());
// consumer got injected all 4 different implementations of IService
// due to CollectionResolver
var consumer = container.Resolve<Consumer>();
// anotherConsumer got injected all 4 different implementations of
// IService due to CollectionResolver
var anotherConsumer = container.Resolve<AnotherConsumer>();
这种场景效果很好,我做了几次。
如果出于某种原因,我想在 Consumer 类的构造函数中只注入(inject) IService 的两个不同实现,例如只注入(inject) FooService 和 BarService (< strong>同时继续在 AnotherConsumer 的构造函数中注入(inject) IService 的所有可用实现)?
有没有一种优雅的方式来做到这一点?
最佳答案
我捕获了 the first edition 的副本的 Dependency Injection Principles, Practices, and Patterns .它包含一个关于温莎城堡的完整章节,并讨论了这个确切的场景。诀窍是做两件事:
.Named(string)
将集合注册定义为命名注册.ServiceOverrides(object)
为 Consumer
指定覆盖以下代码示例几乎直接来自本书(名称已替换为您的示例):
container.Register(Component
.For<IService>()
.ImplementedBy<FooService>()
.Named("Foo"));
container.Register(Component
.For<IService>()
.ImplementedBy<BarService>()
.Named("Bar"));
container.Register(Component
.For<IService>()
.ImplementedBy<BuzzService>()
.Named("Buzz"));
container.Register(Component
.For<IService>()
.ImplementedBy<AwesomeService>()
.Named("Awesome"));
container.Register(Component
.For<Consumer>()
.ServiceOverrides(new
{
services = new[] { "Foo", "Bar" }
}));
container.Register(Component.For<AnotherConsumer>());
var consumer = container.Resolve<Consumer>();
关于c# - 温莎城堡 : inject IEnumerable<IService> using only a subset of registered components for IService,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52702131/
关于我的 MVP 实现的快速问题: 目前我有下面的代码,其中 presenter 和 view 都是通过容器解析的。 然后演示者调用 View.Init 将自己传递给 View 。 但是我想知道是否有
我正在尝试在 NHibernate 上用 CaSTLe 做一个简单的“从产品中选择计数(*),日期 > xxx”。 如果我直接使用 NHibernate,我可以重用 this question答案但不
刚接触城堡/温莎,请耐心等待。 我目前正在使用框架System.Web.Mvc.Extensibility在其启动代码中,它注册了 HttpContextBase,如下所示: container.Re
您好,我在尝试初始化 ActiveRecord 时遇到异常,我不知道我遗漏了什么。我正试图说服我工作的公司使用 CaSTLe ActiveRecord,如果我不能演示它是如何工作的,它看起来不会很好。
对于我当前的项目,我在 C# 中使用 CaSTLe 的 ActiveRecord。对于我的一张表,我确实需要使用自定义类型类(处理愚蠢的时间到时间跨度的转换)。为了保持我的代码干净,我喜欢在对象映射类
在 IIS 中托管的 Windsor ioc、wcf 设施设置下,raven doc session 和存储的推荐生活方式是什么? 我一直看到这个错误: Error TempPathInUse (JE
我决定将我的项目 ASP.NET MVC 4 中的 CaSTLe ActiveRecord 版本从 2.1.2 版本迁移到 3.0.0。还更新了 NHibernate 2.1.2 版本到 3.1.0
我是一名优秀的程序员,十分优秀!