2009-02-26 7 views
1

배경 :LINQ 감사 및 현재 사용자

내가 삽입에 대한 데이터베이스 감사를 할 필요가있는 웹 응용 프로그램이// 삭제 업데이트 (어쩌면 읽기). 내 ORM으로 LINQ를 사용합니다. 웹에서 발견 한 몇 가지 아이디어를 사용하여 감사 테이블과 관련된 엔티티를 꾸미기 위해 속성을 사용하는 방법을 생각해 냈습니다. 감사 테이블 자체는 현재 테이블의 ID 및 이름, 수정 유형, 수정 시간 및 작업의 성공 여부 필드 이외에 원래 테이블과 동일한 유형의 동일한 열을 포함해야합니다. 감사는 SubmitChanges 중 발생합니다 - 내 데이터 컨텍스트는 추상이며 구체적인 구현에서 SubmitChanges를 상속하고 무시합니다. 추상적 인 데이터 컨텍스트는 실제로 DataContext를 확장하고 현재 사용자 ID와 이름에 대한 자리 표시자가있는 CurrentUser 속성을 추가하는 AbstractAuditableDataContext에서 파생됩니다. 기본적으로 이들은 0이고 로그인 된 사용자가없는 인스턴스의 경우 "시스템"입니다. 예를 들어 사용자 테이블의 특정 필드가 업데이트 될 때 등록 또는 로그인 중일 수 있습니다. 이 응용 프로그램은 ASP.NET MVC를 사용하여 C#으로 작성되었습니다.

문제 :

내 파생 데이터 컨텍스트의 현재 사용자 속성을 채울 수있는 가장 좋은 방법은 무엇입니까? CurrentUser가 설정되어 있는지 확인하기 위해 AuditUtility에 주입 된 유틸리티 클래스를 생성해야합니까? 그렇지 않으면 채우지 않아야합니다. 테스트하려면 모의하고 싶지만 살아있는 응용 프로그램에서는 게으르게 사용할 것입니다. 세션에서로드 및 가져 오기/설정 아니면이 기능을 수행하기 위해 모든 컨트롤러가 사용하는 데이터 컨텍스트 팩토리를 수정해야합니까? 이미 단위 테스트를하는 동안 모의 팩토리를 사용하므로 새로운 클래스를 생성하지 않아도됩니다. 또는 파생이 공장 외부에서 수행되어야하고 현재 사용자가 컨텍스트 생성 중에 주입되어야합니다. 이렇게하면 "대신하여"감사를 수행 할 수 있습니다.

나는 이것이 다소 주관적인 것을 알고 있지만, 당신이 기여할만한 생각/경험에 감사드립니다.

감사합니다.

답변

0

현재 데이터 컨텍스트를 사용하고 HttpContext.User.Identity에서 현재 사용자 이름에 해당하는 사용자 개체를 검색하는 GetAuditUser 메서드가있는 CurrentUserUtilityBase 클래스를 만들었습니다. 이 개체를 사용하여 현재 사용자의 ID 및 표시 이름을 추출하고 이러한 속성이 포함 된 AuditUser 개체를 만들고 반환합니다.

내 구현 클래스는 팩토리를 사용하여 데이터 컨텍스트의 인스턴스를 가져오고이 데이터 컨텍스트에서 기본 클래스 메서드를 호출합니다. 내 데이터 컨텍스트의 팩토리 메소드는 현재 사용자 유틸리티를 사용하여 컨텍스트의 현재 사용자를 생성 한 후 컨텍스트에 삽입합니다.

0

DataContext (응용 프로그램, 세션, 요청, BusinessObject .. 당)의 범위는 무엇입니까? 변수가 다르면 DataContext 내에서 현재 사용자를 캐시하지 않을 수도 있습니다 (또는 생성 중에 설정). 아마 필요할 때마다 Session (현재 또는 다른 세션)에서 현재 사용자를 검색하는 DataContext 내에서 Property를 사용할 것입니다.

+0

데이터 컨텍스트 범위는 작업마다 있으며, 수명이 매우 짧습니다. – tvanfosson

1

Windows 또는 양식 인증을 사용하는 경우 아무것도 전달하지 않고 HttpContext를 확인할 수 있습니다. 웹 컨텍스트에 있지 않은 경우 스레드에서 사용자를 가져옵니다. 어쩌면 :

if(HttpContext.Current != null) 
{ 
    //grab the user from the HttpContext 
} 
else 
{ 
    //grab the user from the Thread 
} 
+0

하지만이 코드는 어디에 넣으시겠습니까?데이터 컨텍스트를 만들 때 또는 유틸리티가 호출 될 때마다? – tvanfosson

+0

저항이 가장 적은 경로가 SubmitChanges() 구현에 추가되었을 수 있습니다. 이렇게하면 아무 것도 전달할 필요가 없어지고 DataContext 소비자는 세부 사항을 즐겁게 알 수 있습니다. –

1

System.Threading.Thread.CurrentPrincipal 당신이 찾고있는 대답을 제공해야합니다.