Когда вы создаете сайт, который напрямую использует 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, несмотря на то, что ни один из них явно не используется в вашем веб-проекте.В этом случае использование отдельных проектов помогает только разделить логику, возможно, более кратким и понятным способом, но это , а не служит для фактического абстрагирования любых зависимостей.