2009-06-24 4 views
3

저는 현재 ASP.NET 인적 자원 시스템을 개발 중입니다. MVP 패턴을 기반으로하는 Web Client Software Factory에서 계층화 된 아키텍처를 사용하고 있습니다. ORM은 NHibernate입니다. 감사 로그 모듈을 구현해야합니다. 나는 다른 접근법에 대해 많이 읽었습니다. 대부분의 사람들은 날짜, 타임 스탬프 및 해당 변경자의 신원을 추적하는 방법을 설명하지만 아무도 내 도메인 계층의 속성 변경을 추적하는 방법에 대해 아무에게도 말할 수 없습니다. 나는 어떤 롤백 기능도 필요로하지 않는다. 나는 언제, 누가 그리고 언제 어떤 객체의 속성이 변경되었는지, 그 속성의 이전 값과 새로운 값만 기록 할 필요가있다.감사 로그 접근에 대한 힌트

이 변경 사항의 처리기를 어디에 둘지 결정할 수 없습니다. Fowler는 속성의 setter 메소드에서 감사 로그를 지적했지만 여전히 도메인 클래스를 POCO`s로 유지하려고합니다. 어쩌면 다른 접근법이 있을까요?

+0

이미 AOP를 고려해 보셨습니까? – Paco

답변

2

HR 시스템의 경우 몇 년 전에해야했습니다. 쉽게 오디 팅 만들어 그것에 대해 흥미로운 부분이 있음을

class DataField<T> 
{ 
    public T Current { get; set; } 
    public T Original { get; set; } 
    // stores the field name as a nice textual readable representation. 
    // would default to property name if not defined. 
    public string FieldName { get; set; } 
    public bool Modified 
    { 
     get { return !(Current.Equals(Original)); 
    } 

    public DataField(T value) 
    { 
     Original = Current = value; 
    } 

    public DataField(T value, T fieldName) 
    { 
     Original = Current = value; 
     FieldName = fieldName; 
    } 
} 

했다

: 여기

내가 아래로 손질 만든 템플릿의 예입니다 : 나는 내 모든 '필드'(일반) 템플릿을 구현하는 데 수행 각 객체는 자체 감사 로그를 생성 할 수 있습니다. 나는이 '필드'의 x 번호를 가질 수있는 객체를 취할 수 있으며 GetAudit을 호출하면 필드 이름, 이전 val, 새 val 등을 표시하는 클래스의 모든 변경 사항이 포함 된 감사 객체를 반환합니다. 각 'DataField'는 감사 개체를 반환하는 메서드를 구현합니다. 문자열, double, ints 등의 경우에는 거의 구워졌지만 사용자 정의 객체를 사용하면 감사 객체를 반환해야하는 객체에 대해 감사 구현을 작성할 수 있습니다.

결국 전형적인 형태로 모든 유형의 필드를 가진 하나의 객체에 모든 데이터가 저장됩니다. 그런 다음 업데이트를 수행하고 감사 테이블에도 기록되는 GetAudit 메서드를 호출합니다.

아무것도 형태로 변경했다면 내가 쉽게 여러 페이지 등

취소의뿐만 아니라 부분 또는 전체 개체 수준에 의해 필드, 섹션으로 필드에 정말 쉬웠다 통과했다하더라도 말할 수

.

오랫동안 코드를 건드리지 않았으므로 정확한 세부 사항에 약간의 안개가 낀다. 그러나 그것은 그 요지였다. 희망이 도움이됩니다.

0

아마도 .net이이 패턴을 암시 적으로 (이벤트로) 구현하기 때문에 많은 부가가치는 없을 것이라고 생각하기 때문에 관찰자 패턴을 구현할 수 있습니다.

아마도 "원본"객체를 저장하고 시간이 맞으면 (아마도 리플렉션을 사용하여) 수정 된 객체와 비교하고 어떤 속성이 변경되었고 새로운 값이 무엇인지 확인할 수 있습니다. 그러나 개체를 직렬화 할 수있는 경우를 제외하고는 .net에서 개체의 딥 코디를 만들 수는 없으므로이 솔루션의 경우이를 염두에 두십시오.

0

원본 데이터를 개체에 유지하거나 업데이트 전에 로깅을 위해 데이터베이스에서 가져와야합니다.

이 방법은 저장 프로 시저 또는 트리거에서 데이터 영역에 구현되었지만 도메인 계층에서는 구현되지 않은 것으로 나타났습니다.

편집 : 데이터베이스 트리거를 사용하여 기록을 기록하는 2 부분의 예가 여기에 있습니다. http://www.4guysfromrolla.com/webtech/041807-1.shtml이 기술의 장단점에 대한 좋은 토론이 많이 있습니다. 도움이되기를 바랍니다.

+0

좋아요, 어쩌면 너무 많이하고 싶지만 데이터 계층이나 서비스 계층에서 이러한 접근법을 보여주는 코드 나 다이어그램을 공유 할 수 있습니까? 그런 감사 시스템을 상상할 수는 없습니다 ... – Alkersan

관련 문제