StructureMap синглтоны меняются в зависимости от аргумента? - PullRequest
4 голосов
/ 27 августа 2010

Используя StructureMap, возможно ли иметь одноэлементный объект для каждого значения аргумента?Например, скажем, я хочу сохранить отдельный одноэлементный файл для каждого веб-сайта в многопользовательском веб-приложении:

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

Я хочу сохранить отдельный одноэлементный объект, соответствующий каждому сайту:

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

В настоящее время создается впечатление, что каждый раз, когда я пытаюсь разрешить ISiteSettings, создается новый объект.

Ответы [ 2 ]

5 голосов
/ 29 августа 2010

Спасибо, Джошуа, я принял твой совет.Вот решение, с которым я закончил, которое, кажется, работает нормально.Любые отзывы приветствуются.

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>()
);
4 голосов
/ 29 августа 2010

Область действия Singleton действительно означает singleton - может быть только один экземпляр. Для вашего сценария я бы порекомендовал вам реализовать пользовательский ILifecycle , который использует requestHost (который, как я полагаю, можно извлечь из HttpContext), чтобы вернуть соответствующий кэшированный экземпляр. Взгляните на исходный код StructureMap, чтобы увидеть, как реализованы другие циклы ILife.

Когда вы регистрируетесь For<ISiteSettings>, есть возможность указать свой собственный ILifecycle вместо использования одного из встроенных.

...