Как использовать Asp.net Identity при использовании Business And DataModel Layer - PullRequest
0 голосов
/ 11 апреля 2019

Я создаю приложение с многоуровневой архитектурой.У меня есть отдельный
+ проект «DataModel» только с классами моделей
+ проект «BusinessLogic», содержащий мой бизнес
+ «Основной» проект для запуска Business из пользовательского интерфейса
+ проект «ViewModel»
+ «Веб» проект с основным приложением asp.net.

Моя цель состояла в том, чтобы разделить эти проекты так, чтобы веб-проект ничего не знал о DataModel, поэтому веб-проект должен просто ссылаться на Core и ViewModel.Все было замечательно, пока я не настроил Asp.Net Identity - чтобы настроить авторизацию, мне пришлось обратиться к проекту DataModel, которого я хотел избежать.Можно ли достичь моей цели и (если да) как это сделать.

Примечание:
Я использую этот , как разделить библиотеку моделей при использовании идентичности asp.net за написание моего вопроса, и я не нахожу принятого ответа в качестве моего ответа!

1 Ответ

1 голос
/ 11 апреля 2019

Когда вы создаете сайт, который напрямую использует Identity, вы должны предоставить ему различные «хранилища» Identity: UserStore<TUser>, RoleStore<TRole> и т. Д. По умолчанию и проще всего использовать Entity Framework Core в качестве основы дляхранилища, и Identity поставляется со встроенными хранилищами для работы с EF Core.Однако использование этого требует доступа к контексту, а это значит, что вам потребуется зависимость от уровня данных.При использовании AddEntityFrameworkStores<TContext>.

невозможно обойтись. Если вы хотите сохранить абстрагированный уровень данных, вам потребуется либо 1) использовать централизованный поставщик удостоверений, такой как IdentityServer, либо 2) создавать пользовательскиемагазины.

Например, IdentityServer поддерживает использование EF и Identity в качестве основы.Это означает, что it будет зависеть от уровня данных, но IdentityServer будет существовать в отдельном проекте.Ваш реальный веб-сайт будет обрабатывать аутентификацию через конечные точки IdentityServer и, следовательно, не будет зависеть от уровня данных.На самом деле, он даже не знает и не заботится о том, что вы вообще используете Identity в этот момент.

Создание пользовательских хранилищ будет немного сложнее, очевидно, и если вы не предоставите истинный уровень абстракции,в конечном итоге вы все равно получите зависимость от уровня данных.Это может быть что-то вроде микросервиса (-ов), где хранилище будет фактически отправлять HTTP-запросы службе, чтобы получить нужные ей объекты, вместо непосредственного выполнения запросов к базе данных.Микросервисы, таким образом, будут хранить зависимость от данных.

Одна вещь, которую вы можете не учитывать при этом, заключается в том, что зависимость существует даже без прямой ссылки.Например, если ваш проект Core использует материал из вашего проекта DataModel, а затем ваш веб-проект использует материал из вашего проекта Core, ваш веб-проект имеет неявную зависимость от вашего проекта DataModel .Например, если вы посмотрите на папку bin после сборки, вы увидите DLL для вашего проекта DataModel и даже одну для EF Core, несмотря на то, что ни один из них явно не используется в вашем веб-проекте.В этом случае использование отдельных проектов помогает только разделить логику, возможно, более кратким и понятным способом, но это , а не служит для фактического абстрагирования любых зависимостей.

...