获取依赖项的命名实例

本文关键字:实例 依赖 获取 | 更新日期: 2023-09-27 18:02:21

我有以下代码:

        var container = new Container();
        //car
        container.Configure(
            x => x.For<ICar>().Use<Honda>());
        //engines
        container.Configure(x => x.For<IEngine>().Use<V8Engine>().Named("V8"));
        container.Configure(x => x.For<IEngine>().Use<V12Engine>().Named("V12"));
        var car = container.GetInstance<ICar>();
        Console.WriteLine(car.Name());

IEngineICar具体实现使用的接口,被注入到构造函数中。

现在默认情况下StructureMap将使用V12Engine,但我希望它使用V8Engine代替,我怎么能实现这种情况?

获取依赖项的命名实例

我已经找到了这个问题的解决方案,我在下面给出它,以防其他人需要它:

解决方案1:

        var car = container.With(container.GetInstance<IEngine>("V8")).GetInstance<ICar>();

解决方案2:

        var engine = new V8Engine();
        var car = container.With<IEngine>(engine).GetInstance<ICar>();

解决方案3:(如果你有很多依赖)

        var engine = new V8Engine();
        var eArgs = new ExplicitArguments();
        eArgs.Set<IEngine>(engine);
        var car = container.GetInstance<ICar>(eArgs);

更详细的说明可以在这里找到:http://structuremap.github.io/resolving/passing-arguments-at-runtime/