3

저장소 패턴이있는 서비스 계층을 사용하고 있습니다. 컨트롤러는 서비스 계층에 대한 종속성을 가지며 서비스 계층은 저장소에 대한 종속성을 갖습니다.적절한 방법으로 인증 된 사용자를 내 저장소 클래스에 삽입

내가 승인 용도 저장소 층에 대한 사용자 정보를 기록 통과해야하고 I는 광범위한 분사 체인 것 같다 것을 고려 저장소에 사용자 정보를 주입하기위한 가장 좋은 방법을 결정하기 위해 시도하고있다 :

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

로그인 한 후 현재 보안 주체에 사용자 정보를 할당하십시오. 약 IPrincipalIIdentity에 관한 Google 이 두 클래스는 .NET에 내장되어 현재 로그인 한 사용자를 처리합니다.

사용자에게 액세스하려면 Thread.CurrentPrincipal.Identity을 사용하십시오. 그러나 저장소에서 해당 속성을 사용하지는 않지만 서비스 클래스에서만 사용합니다. 저장소에 정보를 가져올 사용자를 알려주지 않아야한다는 이유입니다.

모든 요청에 ​​대해 사용자를 지정하려면 global.asax에서 PostAuthenticate 이벤트를 사용해야합니다.

관련 문제