Лучший способ динамического создания классов вместо использования блока переключателей

В настоящее время моя функциональность VaryByCustom реализована в классах, реализующих интерфейс IOutputCacheVaryByCustom

public interface IOutputCacheVaryByCustom
{
    string CacheKey { get; }
    HttpContext Context { get; }
}

Класс, реализующий этот интерфейс, имеет несколько соглашений, имя класса будет «OutputCacheVaryBy_______», где пробел значение, которое передается из свойства varByCustom на страницах. Другое соглашение состоит в том, что Context будет установлен через внедрение конструктора.

В настоящее время я ' Основываясь на перечислении и инструкции switch, аналогично

public override string GetVaryByCustomString(HttpContext context, 
                                              string varyByCustomTypeArg)
{
    //for a POST request (postback) force to return back a non cached output
    if (context.Request.RequestType.Equals("POST"))
    {
        return "post" + DateTime.Now.Ticks;
    }
    var varyByCustomType = EnumerationParser.Parse
                            (varyByCustomTypeArg).GetValueOrDefault();


    IOutputCacheVaryByCustom varyByCustom;
    switch (varyByCustomType)
    {
        case VaryByCustomType.IsAuthenticated:
            varyByCustom = new OutputCacheVaryByIsAuthenticated(context);
            break;
        case VaryByCustomType.Roles:
            varyByCustom = new OutputCacheVaryByRoles(context);
            break;
        default:
            throw new ArgumentOutOfRangeException("varyByCustomTypeArg");
    }

    return context.Request.Url.Scheme + varyByCustom.CacheKey;
}

, поскольку я всегда знаю, что класс будет OutputCacheVaryBy + varByCustomTypeArg , и единственным аргументом конструктора будет context Я понял, что я мог бы обойтись без этого прославленного блока if else и просто создать экземпляр моего собственного объекта с помощью Activator .

С учетом сказанного, отражение не является моей сильной стороной, и я знаю, что активатор существенно медленнее по сравнению со статическим созданием и другими способами создания объектов. Есть ли какая-либо причина, почему я должен придерживаться этого текущего кода, или я должен использовать Activator или подобный способ создания моего объекта?

Я видел блог http://www.smelser.net/blog/post/2010/03/05/When-Activator-is-just-to-slow.aspx , но я ' Я не совсем уверен, как это будет применяться, так как я работаю с типами во время выполнения, а не со статическим T.

5
задан Chris Marisic 27 August 2010 в 16:17
поделиться