Могу ли я остановить конструктор dbml от добавления строки соединения в файл dbml? [Дубликат]

Кажется, здесь никто не упоминается, но вы также можете использовать анонимный класс для хранения аргумента generic type (который обычно теряется из-за стирания типа) :

public abstract class TypeHolder<T> {
    private final Type type;

    public TypeReference() {
        // you may do do additional sanity checks here
        final Type superClass = getClass().getGenericSuperclass();
        this.type = ((ParameterizedType) superClass).getActualTypeArguments()[0];
    }

    public final Type getType() {
        return this.type;
    }
}

Если вы экземпляр этого класса анонимным способом

TypeHolder<List<String>, Map<Ineger, Long>> holder = 
    new TypeHolder<List<String>, Map<Ineger, Long>>() {};

, тогда такой экземпляр holder будет содержать неидентифицированное определение пройденного типа.

Использование

Это очень удобно для создания валидаторов / десериализаторов. Кроме того, вы можете создавать типичный тип с отражением (так что если вы когда-либо хотели сделать new T() в параметризованном типе - приветствуется!) [/ ​​G1].

Недостатки / ограничения

  1. Вы должны явно передать общий параметр. Несоблюдение этого правила приведет к потере параметров типа
  2. . Каждый экземпляр будет стоить вам дополнительного класса, который должен быть сгенерирован компилятором, что приводит к загрязнению кластера / jar bloating
30
задан drs9222 19 April 2010 в 15:51
поделиться

3 ответа

Это немного «взломано», но вы можете добавить параметр в свой конструктор (неиспользуемый?), Использовать этот конструктор везде и создать конструктор по умолчанию от дизайнера не доставит вам никаких проблем.

1
ответ дан 28 November 2019 в 00:24
поделиться

Вы можете использовать что-то вроде SqlMetal для создания собственного файла конструктора DataContext, но вы правы - DataContext по умолчанию довольно сложно открыть.

Другой вариант - получить DataContext из фабричного метода, чтобы можно было скрыть, какой конструктор фактически используется. Еще лучше, если вы сделаете это через фреймворк IoC, такой как Castle Windsor. Тогда вы сможете делать что-то вроде:

var context = container.Resolve<DataContext>();
2
ответ дан 28 November 2019 в 00:24
поделиться

Находясь в дизайнере DBML, вы можете щелкнуть правой кнопкой мыши на любом белом месте и выбрать "Свойства" (это не то же самое, что щелкнуть правой кнопкой мыши на файле DBML и выбрать "Свойства"). Оттуда разверните опцию "Подключение". Установите "Application Settings" на False и очистите параметр "Connection String". Эти параметры используются дизайнером для создания конструктора по умолчанию.

После этого вы можете использовать созданный вами конструктор по умолчанию вне файла designer.cs. К сожалению, вам придется повторять этот процесс каждый раз, когда вы будете добавлять новые таблицы в конструктор. Это раздражает, и я чувствую вашу боль.

22
ответ дан 28 November 2019 в 00:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: