4

使用StructureMap,是否有可能爲每個參數的值有一個單獨的對象? 例如,假設我要保持在一個多租戶web應用程序的每個網站不同的單例:StructureMap單身人士因參數而異?

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

我想保持對應於每個網站不同的單個對象:

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

目前,每次嘗試解析ISiteSettings時似乎都會創建一個新對象。

回答

4

Singleton範圍真的意味着單身 - 只能有一個實例。對於你的場景,我建議你實現一個自定義的ILifecycle,它使用requestHost(我假設可以從HttpContext中取出)返回適當的緩存實例。查看StructureMap源代碼,看看其他ILifecycles是如何實現的。

當您註冊For<ISiteSettings>,有指定的,而不是使用內置的。

5

由於約書亞者之一自己ILifecycle,一種選擇,我把你的建議。這是我完成的解決方案,這似乎工作正常。任何反饋讚賞。

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>() 
); 
+0

利用這個地方的租約從查詢字符串確定一個變體,工程巨大。 – 2011-02-15 10:07:43

+0

爲什麼_tenantCaches在這個實現中不是靜態的?如果我在不同的「For」映射中調用新的TenantLifecycle(),我會得到新的對象緩存? – 2012-01-19 12:01:27