2011-03-28 116 views
0

给出两个A和B类,其中B依赖于A(注入的构造函数); B在基础容器中被注册为SingleInstance,并且它被构建。 A在MultiTenantContainer中作为SingleInstance注册,根据tenantId而不同。Autofac:具有多租户依赖性的单实例对象

问题1:将

Resolve<B>() 

认识到B还必须tenantId有什么不同?

问题2:相同,但A被登记为寿命范围的多租户容器内和B取决于

Func<Owned<A>>. 

更新:闭合!

这是一个“我想要的确实是想要的......”的情况,因为我的初学者对语义缺乏理解;具体而言,我需要在租户生命周期范围内建立/共享跨所有分辨率的实例,该实例不存在。得到了一些指导,在问题#318上提交了一个补丁,它在变更集752中被拉到了主干上,我们很高兴去!现在,上面的问题将如下:

给定两个A和B类,其中B依赖于A(构造函数注入); B在基础容器中注册为InstancePerTenant,并且它已构建。 A被登记在MultiTenantContainer作为InstancePerTenant,在tenantId不同...

和回答这两个问题现在是“是”。

感谢特拉维斯和尼克的帮助和维护这个伟大的工具。

回答

0

如果我正确理解你的例子,那么这两个答案都是“否”。

Autofac可防止任何长期存在的实例获得对较短寿命实例的引用。

虽然这可能意味着在这里和那里重新思考设计,以我的经验,这使得更多的可预测的行为。

希望这会有所帮助!

尼克

(顺便说一句,如果你需要,你可以考虑创建与所描述的混凝土构件的另一个问题的任何具体情况的一些输入。)

+0

感谢。我开始仔细阅读资料来了解这一点,而且很快就会明白,这一切都是关于生命的。我很好奇你提到的“保护”。不“拥有”的实例绕过吗? – 2011-03-29 04:10:42

+0

重读你的第二个方案,我不是你的意思是由一个昭然若揭 - 在多租户方面是否仍然参与了第二个方案......但是,是的,你说得对'Owned'改变规则,但它可能会以你所期望的方式出现。这里的大图的一些更多细节可能会有所帮助。干杯! – 2011-03-29 10:47:24

+0

我是新来Autofac和我的问题是获得这种工具本身,而不是它的应用程序的了解,所以抽象的格式是一个更适合。无论如何,它看起来像是一个非启动器,因为MTC通过使用'BeginLifetimeScope(Action )'在子生命周期范围内注册租户特定组件来操作。当只在MTC(子生存期范围)中注册“A”时,任何试图解析“B”(在根上注册)的尝试都将导致“DependencyResolutionException”。 – 2011-03-30 17:11:40