【问题标题】:Simple Injector - Inject specific implementation of interface to specific controllerSimple Injector - 将接口的具体实现注入特定控制器
【发布时间】:2015-11-17 11:54:01
【问题描述】:

我有两个实现相同接口的搜索服务。其中一个用于搜索一小组内部 Umbraco 内容,另一个搜索 Umbraco 和外部内容并使用默认搜索引擎以外的其他内容。我想保留它们,因为它们每个都表现良好,用于它使用的数据集。

是否可以在 Simple Injector 中指定何时注入哪个服务?我想为大多数控制器注册第一个,基本上作为默认实现。然后,我只需要为两个特定的控制器注册第二个。

浏览时我找到了解决此问题的方法,但它在 Ninject 中:

Bind<ITeamRespository>().To<SoccerRepository>().WhenInjectedInto(typeof(SoccerController));

Simple Injector 也可以做同样的事情吗?

【问题讨论】:

    标签: c# dependency-injection umbraco simple-injector


    【解决方案1】:

    Simple Injector 等价物是:

    container.RegisterConditional<ITeamRespository, SoccerRepository>(
        c => c.Consumer.ImplementationType == typeof(SoccerController));
    
    container.RegisterConditional<ITeamRespository, FallbackRepository>(c => !c.Handled);
    

    更多信息可以在documentation找到。

    【讨论】:

    • 首先,感谢您的回答。我试图让 RegisterConditional 工作,因为我觉得这可能是答案。但是,在我启动应用程序时使用它后,我得到了一个 YSOD,说我不能使用 RegisterConditional,因为 AllowOverridingRegistrations 标志设置为 true。我需要能够覆盖注册,才能使用 RegisterConfigurations。我所做的是 RegisterConditional 接口,然后将 AllowOverridingRegistrations 设置为 true。这行得通,但我只是不确定这样编码是否会产生一些后果。
    • @Slowacki:我自己几乎从不覆盖注册,并且发现让业务层的引导程序引导不需要由最终应用程序替换的所有内容并强制结束会更安全应用程序明确“填补漏洞”。
    • @Slowacki:Simple Injector 的条件注册非常严格。例如,如果它在解析服务时发现两个适用的条件注册,它将抛出异常。 Simple Injector 几乎不会默默地失败。但正如您已经注意到的,Simple Injector 不允许覆盖条件注册,因为这会导致歧义(因此意味着 Simple Injector 会静默失败,这是我们倾向于防止的)。
    • 是的,不幸的是,当我尝试在静态类中手动解析服务时:ISearchService searchService = DependencyResolver.Current.GetService() 失败。最后,我决定将搜索界面分成 2 个独立的界面,IdResolver 和 Search,这实际上在它们的职责方面更有意义,并且使用 2 个独立的注册它工作得很好。感谢您提供所有信息和帮助!
    • @Slowacki:两件事。 1. GetService&lt;ISearchService&gt;() 失败的事实意味着您没有调用container.Verify(),这确实是可取的。 2. 我的经验是,条件注册通常表示次优设计,所以很高兴听到这个过程为您带来了更好的设计。干得好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 2020-07-25
    相关资源
    最近更新 更多