c# - 使用 IoC 动态选择接口(interface)实现

标签 c# dependency-injection inversion-of-control castle-windsor ioc-container

我有一种情况,接口(interface)的实现是在运行时确定的。例如,我检查一个字符串,然后确定要使用哪个子类,没有 IoC 它看起来像下面这样:

if (fruitStr == "Apple")
{
    new AppleImpl().SomeMethod();
}
else
{
    new BananaImpl().SomeMethod();
}

AppleImplBananaImpl 都是同一接口(interface)的实现,例如 IFruit

如何使用 IoC/依赖注入(inject)来做到这一点,尤其是在 CaSTLe Windsor 中?

最佳答案

这是关于依赖注入(inject)的最常见问题,在 StackOverflow 上被反复询问。

总之,最好使用模式来解决运行时创建而不是尝试使用容器超过composing object graphs, which is all it is designed for。 .

有几种模式可用于此目的,但最好的选择是使用 Abstract Factory。 , Strategy , 或 combination of the two .确切的解决方案取决于实例的使用方式——如果您需要几个短期实例并希望在使用后丢弃它们,请使用工厂,或者如果您需要在一个过程中一遍又一遍地使用实例,请使用策略循环而不必每次都重新创建它们。这种组合是高性能和低内存消耗之间的折衷。

关于c# - 使用 IoC 动态选择接口(interface)实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34649735/

相关文章:

c# - 在类中的变量上应用自定义标识符

c# - session 过早退出

dependency-injection - WCF 服务的 Unity 依赖注入(inject)

c# - 惰性依赖注入(inject)

dependency-injection - IoC 和动态对象

c# - 显示字符串中最常用的元音 C#

c# - 无法在服务中注入(inject) IOptions

dependency-injection - 为什么人们谈论 DI 框架 "instantiating an object graph"而不是 "instantiating objects"?

asp.net-mvc - 如何解决 MVC 过滤器属性中的依赖注入(inject)

c# - AsPerRequestSingleton() 使用带有 TinyIOC 容器的工厂方法注册