结构图-理解使用和添加语义
本文关键字:添加 语义 结构图 | 更新日期: 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+)中测试了这个问题,这些版本的行为是相同的。
希望这对你有帮助!