2015-02-23 4 views
5

Обновление: Конечно, я попытался добавить using System.ComponentModel.DataAnnotations. Это не работает.Невозможно использовать требуемый атрибут в библиотеке классов vnext asp.net

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

Корпус:
1. Добавьте проект библиотеки классов vppp. Vnxt с настройками по умолчанию.
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?) 

Ниже мой project.json:

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

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

+1

Почему пустые голоса? это кажется мне разумным вопросом. –

+0

@downvoter, добрый ум, чтобы опубликовать причину также. –

ответ

5

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

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

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

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

в

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

Заменить 1.0.0-бета1 с тем, что номер текущей версии. Visual studio автоматически завершит его для вас.


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

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

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

aspnetcore50 сборки для нового ядра 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/

+0

Мой вопрос, почему он работает с Microsoft.DataAnnotations, а не System.ComponentModel.Annotations? –

+0

спасибо. Я попробую это вечером дома (я +3 GMT и не имею VS 2015 на работе). – colotiline

+1

Хорошо, я расширил ответ, чтобы объяснить, почему System.ComponentModel.Annotations не работает, но Microsoft.DataAnnotations делает. –

Смежные вопросы