2009-04-05 2 views
0

В проекте, над которым я сейчас работаю, мы добавили класс-оболочку для доступа к объекту HttpSessionState. Проблема в том, что текущее решение означает, что вам нужно написать какой-то код, чтобы обернуть функциональность. Я придумал следующее решениеНарушение типа перегрузки для создания шаблона кода в C#

/// <typeparam name="TKey">Class used for generating key into session state storage.</typeparam> 
/// <typeparam name="T">Type of object to store.</typeparam> 
public static class SessionManager<TKey, T> 
{ 
    static SessionManager() 
    { 
     _key = typeof(TKey).ToString(); 
    } 

    private static readonly string _key; 
    public static string Key 
    { 
     get { return _key; } 
    } 

    // Other functions ... (Set, IsSet, Remove, etc.) 

} 

Теперь вы можете создать желаемое хранилище, просто используя

using StringStore= Test.SessionManager<System.Boolean, System.String>; 
using StringStore2= Test.SessionManager<System.Version, System.String>; 

StringStore.Set("I'm here"); 
StringStore2.Set("I'm also here"); 

код работает и хорошо, что вы можете легко создать класс-оболочку (один с использованием личных данных) и все статично. Код, однако, немного злоупотребляет системой типов, так что, может быть, это немного неясно? Прежде чем я добавил его я хотел бы получить обратную связь, так вот вопрос:

Если вы мы поддержания указанной системы и столкнулся код, приведенный выше, будет вам

  1. выследить и убить кто проверил файл в?
  2. Будьте немного раздражены попыткой быть умными, но пусть это скользит?
  3. Думайте, что это был хороший способ избежать кода шаблона?

Вы бы предпочли использовать инструмент для создания текста], например T4?

Спасибо за любые ответы,

Мадс

+0

Я бы охотился на вас. Что это делает, кроме как избавиться от приведения после вызова 'HttpSessionState.Item'? – munificent

ответ

0

Если использование System.Boolean против System.Version просто различать разные типы, чтобы получить отдельные экземпляры _key в систему, мой ответ был бы где-то между # 1 и # 2. По крайней мере, прокомментируйте это и создайте некоторые типы фиктивных (возможно, просто пустых интерфейсов), чтобы использовать вместо использования произвольных типов .NET.

Я говорю об этом как о ком-то, чья основная работа - обзор кода за последние 6 месяцев. Если вы работаете с большим количеством других людей, которые должны понимать этот код, это будет трудно понять и поддерживать, если вы, по крайней мере, не дадите читателю некоторую подсказку.

1

Итак, вы используете общие для создания ключа для словаря. Я бы сказал, что это определенно не очень хорошая идея по нескольким разным причинам.

Первая причина в том, что это нарушает рассуждения за ключом словаря. Ключ должен иметь некоторое значение для ценности, которое он имеет. Почему вы храните строку в System.Boolean? Что означает System.Boolean? Означает ли это, что строка является либо истинной, либо ложной? Подобное замешательство затрудняет поддержку кода. Я также подозрительно, что ключевое значение используется при передаче строки в другом месте кода. Это явно неправильное смешивание словарей и дженериков.

Вторая причина заключается в том, что сеанс является общим для сеанса пользователя. Таким образом, два совершенно разных сегмента кода, написанных двумя разными разработчиками, получают доступ к этой общей папке. Что нужно, чтобы один разработчик не мог определить System.Boolean как подходящий тип ключа для данных A в своем коде, а другой - использовать System.Boolean в качестве ключевого типа для данных B в своем коде? Теперь первый разработчик ожидает A при доступе к этому ведро, но получает B. Значительный уникальный ключ предотвратит это.