3

Я использую сервисный уровень с шаблоном репозитория. Контроллер имеет зависимость от уровня обслуживания, а уровень сервиса зависит от репозитория.Правильный способ зависимостей ввести аутентифицированный пользователь в мой класс репозитория

Я должен пройти вход в пользовательской информации в хранилище слоя для целей авторизации и пытаюсь определить наилучший подход для инъекций пользовательской информации в хранилище, учитывая, что я, кажется, имею обширную инъекционную цепь:

controller -> service(s) -> repositories -> logged in user info. 

Я думаю, легкий подход должен был бы передать пользователю информацию в методах обслуживания, которые дозвонились (т.е. FindById(int primaryKey, User currentUser) и т.д.)

Но это, кажется, очень ограничивает и проблематичной вниз по дороге, в отличие от инъекционного информации пользователя ,

Каков рекомендуемый подход к этой проблеме?


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

class GenericRepository<T>: IRepository<T> { 
    private readonly ICurrentUserFetcher currentUserFetcher; 
    public GenericRepository<T>(Func<IIdentity> currentUserFetcher) { 
     this.currentUserFetcher = currentUserFetcher; 
    } 
    public void Update(T entity) { 
     var currentUser = currentUserFetcher(); 
     ... 
    } 
} 
var repo = new GenericRepository<Person>(() => HttpContext.Current.User.Identity); 
+0

Я думаю, что нашел статью, которая, кажется, касается этой проблемы. Проблема в том, что я пытаюсь отделить контекст http от репозиториев, и это, похоже, делает это красиво. Вот статья: http://stackoverflow.com/questions/2946042/accessing-the-identity-object-in-a-mvc-repository. Существуют ли какие-либо негативные проблемы с этим подходом, с точки зрения развязки? – user1790300

ответ

0

Присвоить информацию о пользователе текущему руководству после входа в систему. Google около IPrincipal и IIdentity. Эти два класса встроены в .NET для обработки текущего зарегистрированного пользователя.

Для доступа к пользователю просто используйте Thread.CurrentPrincipal.Identity. Однако я бы не использовал это свойство в репозитории, но только в классе службы. Причина в том, что хранилище не должно отвечать за то, какой пользователь должен получать информацию.

Чтобы назначить пользователя по каждому запросу, вы должны использовать событие PostAuthenticate в global.asax.

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