Использование общих классов с ObjectDataSource - PullRequest
9 голосов
/ 10 сентября 2008

У меня есть общий класс репозитория , который я хочу использовать с ObjectDataSource. Репозиторий находится в отдельном проекте под названием DataAccess. Согласно это сообщение из групп новостей MS (соответствующая часть скопирована ниже):

Внутренне ObjectDataSource вызывает Type.GetType (string), чтобы получить тип, поэтому мы должны следовать руководству, задокументированному в Type.GetType о том, как чтобы получить тип с помощью дженериков. Вы можете обратиться к библиотеке MSDN на Type.GetType:

http://msdn2.microsoft.com/en-us/library/w3f99sx1.aspx

Из документа вы узнаете, что вам нужно использовать backtick (`) для обозначает имя типа, которое использует дженерики.

Также здесь необходимо указать имя сборки в строке имени типа.

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

TypeName = "TestObjectDataSourceAssembly.MyDataHandler`1 [System.String], TestObjectDataSourceAssembly"

Хорошо, имеет смысл. Однако, когда я пытаюсь это сделать, страница выдает исключение:

<asp:ObjectDataSource ID="MyDataSource" TypeName="MyProject.Repository`1[MyProject.MessageCategory],DataAccess" />

[InvalidOperationException: тип, указанный в свойстве TypeName ObjectDataSource 'MyDataSource', не найден.]

Любопытно, что это происходит только при просмотре страницы. Когда я открываю диалоговое окно «Настройка источника данных» из конструктора VS2008, оно правильно показывает мне методы моего общего класса репозитория. Передача строки TypeName в Type.GetType () во время отладки также возвращает допустимый тип. Так что же дает?

Ответы [ 3 ]

13 голосов
/ 10 сентября 2008

Сделай что-нибудь подобное.

Type type = typeof(Repository<MessageCategory);
string assemblyQualifiedName = type.AssemblyQualifiedName;

получить значение assemblyQualifiedName и вставить его в поле TypeName. Обратите внимание, что Type.GetType (string), передаваемое значение должно быть

Завершенное сборкой имя типа для получения. См. AssemblyQualifiedName . Если тип находится в текущей выполняющейся сборке или в Mscorlib.dll, достаточно указать имя типа, соответствующее его пространству имен.

Таким образом, он может работать, передавая эту строку в вашем коде, потому что этот класс находится в текущей исполняемой сборке (где вы ее вызываете), где как ObjectDataSource нет.

Скорее всего, вы ищете это

MyProject.Repository`1[MyProject.MessageCategory, DataAccess, Version=1.0.0.0, Culture=neutral, PublicKey=null], DataAccess, Version=1.0.0.0, Culture=neutral, PublicKey=null
1 голос
/ 21 октября 2014

Я знаю, что это старый пост, но у меня недавно была эта проблема. Другим решением было бы заменить наследование составом объекта, например

[DataObject]
public class DataAccessObject {
    private Repository<MessageCategory> _repository;

    // ctor omitted for clarity
    // ...

    [DataObjectMethod(DataObjectMethodType.Select)]
    public MessageCategory Get(int key) {
        return _repository.Get(key);
    }
}

Таким образом ObjectDataSource не знает о хранилище, потому что оно скрыто внутри класса. У меня есть библиотека классов в моем фасадном слое, которая является вполне разумным местом для размещения этого кода в проекте, над которым я работаю.

Кроме того, если вы используете Resharper и интерфейсы, можно заставить Resharper выполнить рефакторинг с помощью функции Resharpers "Implement using field".

0 голосов
/ 30 сентября 2009

Даррен,

Большое, большое спасибо за ваш пост. Я боролся с этим весь день. Странно, но в моем случае мне нужно удвоить квадратные скобки, например, для вашего кода:

MyProject.Repository`1 [[MyProject.MessageCategory, DataAccess, версия = 1.0.0.0, культура = нейтральный, PublicKey = ноль]], DataAccess, версия = 1.0.0.0, культура = нейтральный, PublicKey = ноль

Роджер

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...