Предотвращение чрезмерного использования пространств имен

Моя библиотека использует несколько вложенных пространств имен, расположенных следующим образом:

Library name
    Class name 1
    Class name 2
    Class name 3
    [...]
    Utilities
        Class name 1
            [...]
        Class name 2
            [...]
        Class name 3
            [...]
        [...]

Пространство имен «Утилиты» содержит полезные расширения для каждого из классов, которые не гарантируют включения в сам класс.

Пространство имен «Имя библиотеки» необходимо, поскольку оно позволяет избежать широких конфликтов с другими библиотеками, Пространство имен «Utilities» необходимо, чтобы избежать неоднозначности, которая возникает из таких вещей , а пространство имен «Class name» внутри него позволяет избежать конфликтов имен между утилитами, написанными для подобных классов.

Несмотря на это, на практике это по-прежнему является огромной проблемой. Возьмем, к примеру, следующее:

MyLibrary::MyContainer Numbers = MyLibrary::Utilities::MyContainer::Insert(OtherContainer, 123, 456);
// Oh God, my eyes...

Это заставляет меня думать, что я делаю что-то серьезно неправильно. Есть ли более простой способ сохранить порядок? {public ...

У меня есть действие контроллера, определение которого выглядит как-

public ActionResult ChangeModel( IEnumerable info, long? destinationId)

И модель:

public class MyModel
{
    public string Name; //Gets populated by default binder
    public long? SourceId; //remains null though the value is set when invoked
}

Свойство 'Name' заполняется в действии контроллера, однако Свойство SourceId остается пустым. Также заполняется destinationId , который является параметром long? .

При пошаговом просмотре исходного кода MVC (версия 2) это исключение генерируется DefaultModelBinder.

Преобразование параметра из типа System.Int32 в тип 'System.Nullable`1 [[System.Int64, mscorlib, Version = 2.0.0.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089]]' сбой, поскольку преобразователь типов не может преобразовать эти типы.

Если модель изменена на длинную, а не на длинную?, связыватель модели по умолчанию устанавливает значение.

public class MyModel
{
    public string Name {get;set;}; //Gets populated by default binder
    public long SourceId {get;set;}; //No longer long?, so value gets set
}

Это известная проблема? Поскольку исходный код MVC оптимизирован, я не могу выполнить пошаговое выполнение большей части кода.

Обновление: отправляемый запрос представляет собой Http POST с использованием Json с исходным JSon, напоминающим -

{"info":[{"Name":"CL1","SourceId":2}], "destinationId":"1"}

13
задан QED 2 May 2011 в 19:31
поделиться