2012-02-03 2 views
2

일종의 감사를 수행해야합니다. 우리는 레코드가 삽입, 업데이트, 제거 또는 열릴 때 저장하려고합니다. 일부의 경우좋은 감사 알고리즘을 설계하는 방법은 무엇입니까?

private void RemoveSomeObject(SomeObject myObject) 
{ 
    /* Do some stuff that removes the object*/ 

    MySingleton.GetInstance().Audit(myObject.Title, AuditTypes.Delete) 
} 

:

MyForm.cs :이 메소드를 호출 양식에

public void Audit(string audit, AuditTypes type) 
{ 
    AuditEntry = new AuditEntry(){ Audit = audit, TypeId = (int)type }; 

    // some logic to commit the audit entry to the database 
} 

public enum AuditTypes 
{ 
    Insert = 1, 
    Update = 2, 
    Delete = 3 
    Open = 4 
} 

어딘가에 :

은 지금 나는 싱글 클래스에 간단한 방법을 만들었습니다 이유는,이 방법이 코드의 모든 곳에서이 방법을 사용하기 때문에 나는 이런 종류의 선을 가지기 때문에 이것이 갈 길이 없다고 생각합니다.

더 많은 OO 방식으로하는 것이 더 스마트하다고 생각합니다. 어떻게 생각합니까? 편집 :

사용자 ID와 날짜를 기록하지만 알림과 관련이 없습니다.

+1

이것이 옵션인지는 모르지만, 과거에는 * table * _audit 버전에 대해 삽입/업데이트/삭제 트리거로 감사를 수행하는 시스템에서 작업했습니다. 테이블의. – asawyer

+1

어느 RDBMS입니까? 감사 데이터 변경 * 실제로는 데이터베이스에 속해 있습니다 ... – Yuck

+0

그는 데이터베이스에 대해서도 언급하지 않았는데 왜 데이터베이스가 관련되어 있다고 가정합니까? 우리가 알고있는 모든 것에 대한 트위터 스팸봇이 될 수 있습니다. – Aidan

답변

1

그럼 분명히 싱글 톤 (고유 한 악의에 대한 Google)을 피해야하지만 분명히 당신의 접근 방법에 많은 잘못된 점이 있다고 생각하지 않습니다. OO 방식으로 작업을 수행하는 것이 더 현명한 방법입니다. 가독성이나 성능 또는 정확성과 같은 중요한 요소에 대해 코드를 잘 작성하면 더 똑똑합니다. OO-ness는 그다지 중요하지 않습니다.

private void RemoveSomeObject(SomeObject myObject, Auditer myAuditer) 
{ 
    // do stuff // 

    myAuditer.Audit(...); 
} 

(그런데 당신은 아마로 양식의 밖으로 제거 논리를 취해야한다 :

그래서 당신이 감사해야하는 작업을 할 때마다 나는 당신의 감사의 인스턴스를 주입 할 것이다 당신의 싱글 라운드 얻을 수 있습니다 음, 그리고 다른 레이어에 넣으십시오 - 각 클래스는 하나의 책임만을 가져야합니다.)

+0

이 방법을 사용하면 호출자는 작업을 감사 할 것임을 알아야합니다. 이 말이 맞는가요? – Martijn

+0

RemoveSomeObject 메서드를 도메인 계층에서 이동하면 (필자의 경우) 그렇습니다. 사용자는 Remove() 메서드를 호출 한 다음 RemoveSomeObject() 메서드를 호출합니다. 사용자는 감사에 대해 알지 못하지만 도메인 계층은 알 수 있습니다. – Aidan

+0

인터페이스에 대해 프로그래밍하는 경우 데코레이터 패턴을 따라 필요에 따라 감사를 추가 할 수 있습니다. –

0

감사인 객체에 대한 메소드 호출 횟수를 줄이기 위해 데이터 레이어 내에서 가능한 한 가장 낮은 수준에서 감사하는 것이 좋습니다.

내 감사의 경험을 통해 이전 이미지와 이후 이미지의 사본, 변경 날짜와 시간 및 변경자를 유지하는 것이 유용하다는 것을 알았습니다.

2

CRUD 유형 작업을 수행 할 때 종종 Repository Design Pattern을 사용하여 데이터 액세스 계층을 캡슐화하는 것이 좋습니다. 당신을위한 감사를 처리하는 저장소 클래스의 기본 클래스를 가질 수 있습니다.

+0

우리는 작업 단위 및 저장소로 작업하고 있습니다. – Martijn

1

이것은 Aspect-oriented programming의 대표적인 예입니다. 기본적으로 시스템의 여러 부분 (예 : 로깅 또는 감사)으로 확산 될 크로스 커팅 요구 사항이 있습니다. 문제는 귀하의 접근 방식이 정확하지만 유지 보수가 어려우며 확장 성이 좋지 않다는 것입니다. 시간이 있고 원한다면, 이것에 대해 읽고 PostSharp을 사용해보십시오. 무료 초보자 용 버전입니다. 또한 이것을 확인할 수 있습니다 : AOP in .NET

관련 문제