代码之家  ›  专栏  ›  技术社区  ›  Chris Fulstow

StructureMap单例随参数变化?

  •  4
  • Chris Fulstow  · 技术社区  · 14 年前

    For<ISiteSettings>().Singleton().Use<SiteSettings>();
    

    ObjectFactory.With<string>(requestHost).GetInstance<ISiteSettings>();
    

    当前,每次尝试解析ISiteSettings时,它似乎都会创建一个新对象。

    2 回复  |  直到 14 年前
        1
  •  4
  •   Joshua Flanagan    14 年前

    Singleton范围实际上意味着Singleton—只能有一个实例。对于您的场景,我建议您实现一个 ILifecycle 它使用requestHost(我假设可以从HttpContext中提取)返回相应的缓存实例。看看StructureMap源代码,看看其他ILifecycles是如何实现的。

    For<ISiteSettings> ,有一个选项可以指定您自己的ILifecycle,而不是使用内置的ILifecycle。

        2
  •  5
  •   Chris Fulstow    14 年前

    谢谢乔舒亚,我接受了你的建议。这是我最后提出的解决方案,似乎效果不错。感谢您的反馈。

    public class TenantLifecycle : ILifecycle
    {
        private readonly ConcurrentDictionary<string, MainObjectCache> _tenantCaches =
            new ConcurrentDictionary<string, MainObjectCache>();
    
        public IObjectCache FindCache()
        {
            var cache = _tenantCaches.GetOrAdd(TenantKey, new MainObjectCache());
            return cache;
        }
    
        public void EjectAll()
        {
            FindCache().DisposeAndClear();
        }
    
        public string Scope
        {
            get { return "Tenant"; }
        }
    
        protected virtual string TenantKey
        {
            get
            {
                var requestHost = HttpContext.Current.Request.Url.Host;
                var normalisedRequestHost = requestHost.ToLowerInvariant();
                return normalisedRequestHost;
            }
        }
    }
    

    使用StructureMap配置:

    ObjectFactory.Initialize(
        x => x.For<ISiteSettings>()
            .LifecycleIs(new TenantLifecycle())
            .Use<SiteSettings>()
    );