我们处于类似情况,在您的问题下谈论您评论的这一部分:
...我们有一个 Web 应用程序的网站/实例,根据您的身份,我们会连接到您所属的数据库。所以我们希望每个请求都有一个隔离的容器,以避免状态溢出到不同的系统(用户 A 从用户 B 的系统中获取一个对象)......
我正在寻找相同的功能,它应该是多线程安全的。然后我找到了这个链接:
StructureMap:多线程环境。没有为 PluginFamily 定义默认实例
结果可以这样描述:
1)要求:您的解决方案中有一个抽象。而不是StructureMap.ObjectFactory.GetInstance
......所有部分都应该调用你的
Factory.GetInstance(type)
(及其提供者,将调用StructureMap (SM) 或以后的任何其他IoC提供者)
2) 如果是这种情况(或者您可以为您的 引入例如 Manager 模式Factory
,并让您的所有代码在SM上缩进)我们可以创建两个(或更多)容器。
首先是默认的
public class DefaultProfileRegistry : Registry
{
public DefaultProfileRegistry()
{
// whatever calls needed to initialize this registry
SetScans(this); // scan
SetSetterInjection(this); // DI
Profile("DefaultProfile", SetDefaults); // even some common defaults
}
现在让我们创建一个不同的Registry
public class SpecialProfileRegistry : Registry
{
public SpecialProfileRegistry()
{
DefaultProfileRegistry.SetScans(this); // use part from default
...
Profile("Special", DefaultProfileRegistry.SetDefaults); // common defaults
}
好吧,我们有:两个Registry
。一是默认,二是特殊可以从中获利并调整一部分,或者完全不同......
3)在实现器中注册它们,IFactoryProvider
例如StructureMapFactoryProvider
(SMFP):
public partial class StructureMapFactoryProvider : IFactoryProvider
{
private static readonly IContainer Special;
static StructureMapFactoryProvider()
{
// 1) the default registry container
ObjectFactory.Initialize(x =>
{
x.UseDefaultStructureMapConfigFile = false;
// Defaults
x.IncludeRegistry<DefaultProfileRegistry>();
});
ObjectFactory.Container.SetDefaultsToProfile("DefaultProfile");
// 2) and now register the other(s)
Special = new StructureMap.Container(new SpecialProfileRegistry());
Special.SetDefaultsToProfile("Special");
}
好吧,现在,当我们第一次接触到我们的 SMFP 时,所有的容器都被实例化了……
4)最后在里面IFactoryProvider.GetInstance()
,我们可以决定使用什么
object IFactoryProvider.GetInstance(Type type)
{
var useSpecial = ... // get the information to decide
if (useDefault)
{
return Special.GetInstance(type);
}
else
{
return ObjectFactory.GetInstance(type);
}
5)useSpecial
必须在这个地方以某种方式可用。并且绝不能依赖IFactoryProvider.GetInstance()
. 如果在整个请求处理过程中此值是constIContainer
,则正确的将提供正确的对象。
6)每一个都IContainer
可以有不同的Conventions,不同的LiefCycle设置......即使在PluginType
注册了数千个 s 的情况下,这个解决方案也提供了非常好的性能并且是多线程安全的(例如,没有配置文件切换)