结构图-理解使用和添加语义

本文关键字:添加 语义 结构图 | 更新日期: 2023-09-27 18:07:08

我使用NServiceBus &StructureMap 2.6.2连接在一起:

var bus = Configure.WithWeb().StructureMapBuilder(container)
ObjectFactory.Container.Configure(r => 
    r.For<IBus>().Singleton().Use(Configure.Instance.CreateBus().Start())
);
container.Configure(r => r.For<IBus>().Singleton().Add<MyBus>().Named("named"));

我希望第一次注册是默认的,第二次注册可作为一个命名的。但是当我运行:

var bus1 = container.GetInstance<IBus>();
var bus2 = container.GetInstance<IBus>("named");

我得到了MyBus类型的两个实例。根据这个问题,第一个实例必须来自第一次注册(类型为UnicastBus),但事实并非如此。

我是否理解Use和Add语义有误?

结构图-理解使用和添加语义

您正在注册ObjectFactory容器实例中的第一个实例。第二个实例正在名为container的本地容器实例中注册。

要使此行为正常工作,您需要为两个注册使用相同的容器实例。

顺便说一句,你不应该使用ObjectFactory静态实例(根据文档)。

容器的静态ObjectFactory包装器在3.0中仍然可用,但我们强烈建议不要在新应用程序中使用它。它的存在只是为了更容易与旧的安装兼容。

两个注册:

ObjectFactory.Container.Configure(r => 
    r.For<IBus>().Singleton().Use(Configure.Instance.CreateBus().Start())
);

container.Configure(r => r.For<IBus>().Singleton().Add<MyBus>().Named("named"));

应用于容器的不同实例(container != ObjectFactory.Container)。这导致container只有一个IBus (MyBus)的注册,这就是为什么您只能解决这个依赖关系。当你只为特定的插件类型注册一个类型(即使它被命名为实例),你可以在使用container.GetInstance<TPluginType>()时解决它。要修复此问题并获得预期的行为,您需要更改此注册:

ObjectFactory.Container.Configure(r => 
    r.For<IBus>().Singleton().Use(Configure.Instance.CreateBus().Start())
);
与这个:

container.Configure(r => 
    r.For<IBus>().Singleton().Use(Configure.Instance.CreateBus().Start())
);

在两个版本的SM(2.6和3+)中测试了这个问题,这些版本的行为是相同的。

希望这对你有帮助!