使用IoC动态选择接口实现

dar*_*cyq 4 c# dependency-injection castle-windsor ioc-container inversion-of-control

我有一种情况,在运行时确定接口的实现.例如,我检查一个字符串然后确定要使用哪个子类,没有IoC它看起来如下所示:

if (fruitStr == "Apple")
{
    new AppleImpl().SomeMethod();
}
else
{
    new BananaImpl().SomeMethod();
}
Run Code Online (Sandbox Code Playgroud)

这两个类AppleImplBananaImpl都实现同一个接口,比方说IFruit.

如何使用IoC/Dependency Injection来完成,特别是在Castle Windsor

Nig*_*888 6

这是关于依赖注入的最常见问题,并在StackOverflow上反复询问.

简而言之,最好使用模式来解决运行时创建问题,而不是尝试使用容器来构建对象图,而不仅仅是组合对象图.

有几种模式可用于此,但最好的选择是使用抽象工厂,策略两者的组合.确切的解决方案取决于实例的使用方式 - 如果您需要几个短期实例并希望在使用后丢弃它们,请使用工厂,或者如果您需要在一个实例中反复使用实例,请使用策略循环而不必每次都重新创建它们.这种组合是高性能和低内存消耗之间的权衡.