.net - StructureMap 单例因参数而异?

标签 .net asp.net-mvc dependency-injection inversion-of-control structuremap

使用 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/

相关文章:

javascript - Nopcommerce 插件查看 : CSS and JavaScript Files Not Found (404)

.net - 如何在 .NET 中将字符串转换为字节数组?

jquery - 从 jQuery Grid 插件将额外参数传递给 ASP.NET MVC Controller 操作

c# - 如何在一个项目中使用两个不同的 Microsoft Interop 程序集?

.net - 如何通过 @Html.EditorFor 将 ViewData 的值传递给编辑器模板

java - 用 Dagger 改造类的 HashMap

java - 使用注释的依赖注入(inject)如何在内部工作,无论它是调用 setter 方法还是基于构造函数的注入(inject)

java - 让 hk2 和 Jersey 注入(inject)类

.net - 连接字符串中的集成安全性

c# - 如何从 Regex.Split 中获得正确的结果