Невозможно использовать обязательный атрибут в библиотеке классов asp.net vnext

Обновление: Конечно, я пытался добавить using System.ComponentModel.DataAnnotations. Это не работает.

Проблема: я не могу использовать атрибут Required в проекте библиотеки классов asp.net vnext.

Пример:
1. Добавьте проект библиотеки классов asp.net vnext с настройками по умолчанию.
2. Создайте класс Human со строковым свойством Name.
3. Добавьте атрибут Required к Name.
4. Получите ошибка компиляции:

Error   CS0246  The type or namespace name 'Required' could not be found (are you missing a using directive or an assembly reference?)  

Ниже мой проект.json:

{
    "version": "1.0.0-*",
    "dependencies": {
        "System.ComponentModel.Annotations": ""
    },
    "frameworks": {
        "aspnet50": {
        },
        "aspnetcore50": {
            "dependencies": {
                "System.Runtime": ""
            }
        }
    }
}

Также я могу использовать DataAnnotations в asp.net vnext, но не в библиотеке классов vnext. Почему?


person Mark Twain    schedule 23.02.2015    source источник
comment
Почему отрицательные голоса? это кажется мне разумным вопросом.   -  person Jared Kells    schedule 24.02.2015
comment
@downvoter, пожалуйста, также укажите причину.   -  person Jitendra Pancholi    schedule 24.02.2015


Ответы (1)


Веб-проект vNext зависит от Microsoft.AspNet.Mvc. Это приводит к большому дереву зависимостей, аннотации данных находятся в пакете Microsoft.DataAnnotations

Добавьте зависимость для Microsoft.DataAnnotations, чтобы использовать атрибуты контракта данных.

В вашем файле project.json изменить

"dependencies": {
    "System.ComponentModel.Annotations": ""
},

to

"dependencies": {
     "Microsoft.DataAnnotations":  "1.0.0-beta1"
},

Замените 1.0.0-beta1 любым номером текущей версии. Visual Studio автоматически заполнит его для вас.


Почему работает Microsoft.DataAnnotations, а не System.ComponentModel.Annotations?

Из небольшого расследования System.ComponentModel.Annotations содержит две цели

  • aspnetcore50\System.ComponentModel.Annotations.dll
  • contract\System.ComponentModel.Annotations.dll

Сборка aspnetcore50 предназначена для новой Core CLR. Он содержит атрибут Required и работает для Core CLR.

Сборка contract содержит все типы, но методы пусты. Это похоже на фиктивную зависимость, которая должна выполняться фреймворком. Эта фиктивная сборка используется в .NET 4.5, поэтому ваш проект, ориентированный как на .NET 4.5, так и на Core CLR, не может найти атрибут Required.

С другой стороны, пакет Microsoft.DataAnnotations зависит от System.ComponentModel.Annotations, но также ссылается на сборку фреймворка System.ComponentModel.DataAnnotations, которая фактически предоставляет типы при запуске в .NET 4.5.

Я нашел этот пост интересным. В конце поста объясняется, что представляют собой эти контрактные сборки. http://alxandr.me/2014/07/20/the-problems-with-portable-class-libraries-and-the-road-to-solving-them/

person Jared Kells    schedule 24.02.2015
comment
Мой вопрос: почему он работает с Microsoft.DataAnnotations, а не с System.ComponentModel.Annotations? - person Jared Kells; 24.02.2015
comment
Большое тебе спасибо. Вечером дома попробую (у меня +3 по Гринвичу и на работе нет VS 2015). - person Mark Twain; 24.02.2015
comment
Хорошо, я расширил ответ, чтобы объяснить, почему System.ComponentModel.Annotations не работает, а Microsoft.DataAnnotations работает. - person Jared Kells; 24.02.2015
comment
Я частично разобрался с проблемой восклицательного знака. KPM не загружает пакеты в .kpm/packages. Теперь я должен выяснить, почему. - person Mark Twain; 24.02.2015
comment
Для возможных будущих читателей. Я разрешил установку пакета, используя kpm install из cmd. - person Mark Twain; 24.02.2015