使用 StructureMap,是否可以为参数的每个值创建一个单例对象? 例如,假设我想为 Multi-Tenancy Web 应用程序中的每个网站维护不同的单例:
For<ISiteSettings>().Singleton().Use<SiteSettings>();
我想为每个站点维护一个不同的单例对象:
ObjectFactory.With<string>(requestHost).GetInstance<ISiteSettings>();
目前,每次我尝试解析 ISiteSettings 时,似乎都会创建一个新对象。
最佳答案
谢谢约书亚,我听取了你的建议。这是我完成的解决方案,看起来效果很好。任何反馈表示赞赏。
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>()
);
关于.net - StructureMap 单例因参数而异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3581729/