Доступ к объекту Identity в хранилище MVC - PullRequest
0 голосов
/ 01 июня 2010

У меня есть довольно общий репозиторий, который выполняет базовые CRUD для многих из моих бизнес-объектов. Объекты наследования образуют общий объект, который имеет несколько полей, которые я поддерживаю для всех объектов. например. ModifiedBy, CreatedBy, CreatedDate, ModifiedDate.

Эти поля ModifiedBy и CreatedBy всегда будут установлены перед любым обновлением / сохранением.

Мои вопросы: Есть ли способ получить доступ к объекту Identity из моего веб-приложения MVC в моих репозиториях? Я надеялся установить модифицированную личность пользователя для любого обновления в один выстрел ??

С наилучшими пожеланиями, Rod

1 Ответ

5 голосов
/ 01 июня 2010

Хорошо, вы можете получить доступ к HttpContext.Current.User.Identity непосредственно в своих репозиториях, но я бы не рекомендовал его, поскольку это сделает ваши репозитории зависимыми от HttpContext.

Альтернативы:

  • Добавьте явный параметр IIdentity в ваши методы Create / Update, например, void Update(T entity, IIdentity user)
  • Разъединить логику «получения текущего пользователя», например ::1122*

    class GenericRepository<T>: IRepository<T> {
        private readonly ICurrentUserFetcher currentUserFetcher;
        public GenericRepository<T>(ICurrentUserFetcher currentUserFetcher) {
            this.currentUserFetcher = currentUserFetcher;
        }
        public void Update(T entity) {
            var currentUser = currentUserFetcher.Get();
            ...
        }
    }
    interface ICurrentUserFetcher {
        IIdentity Get();
    }
    class WebCurrentUserFetcher: ICurrentUserFetcher {
        public IIdentity Get() {return HttpContext.Current.User.Identity;}
    }
    

    Или даже проще:

    class GenericRepository<T>: IRepository<T> {
        private readonly Func<IIdentity> 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);
    

    Используйте контейнер IoC для соединения.

...