문제

지금 나는 일을 더 현명하게 할 수 있는 방법을 찾으려고 노력하고 있으며, 그 과정에서 내가 할 수 있었던 것은 하루에 엑세드린 한 병을 다 사용하는 것뿐이었습니다.

이와 같이 IRepository라는 인터페이스가 있다고 가정합니다.

 public interface IRepository<T>
 {
    T Get(int id);
    void Add(T value);
    void Update(T value);
    void Delete(T value);
    ...
 }

그리고 내가 다음과 같은 구현을 가지고 있다고 가정합니다.

public class NHibernateRepository<T>
{
    ...
}

이제 모든 것이 괜찮습니다. 모든 CRUD 기능을 지원하기 위해 저장소에 대해 모든 기본 작업을 수행할 수 있지만 특수 작업이 필요할 수도 있으므로 다음과 같은 인터페이스가 있다고 가정합니다.

public interface IUserRepository : IRepository<User>
{
     IList<User> GetUsersByRole(Role role);
}

그리고 다음과 같은 구현:

public class UserRepository : NHibernateRepository<User>, IUserRepository
{
    ....
}

자, 이것이 기본 설정입니다. 이제 하고 싶은 일이 한 가지 더 있습니다.나는 로깅과 트랜잭션 등을 모두 투명하게 갖고 싶습니다.그래서 제가 하고 싶은 것은 Castle Windsor 또는 StructureMap과 같은 종속성 주입 프레임워크를 사용하여 IRepository를 요청할 때 IRepository를 구현하는 LoggingRepository와 TransactionRepository로 래핑되도록 하는 것입니다.

그래서 제가 하고 싶은 일은 다음과 같습니다.

IUserRepository repository = container.Resolve< IUserRepository>();

그리고 Logging 및 Transaction 데코레이터에 포함된 사용자 저장소를 반환하도록 하세요. 하지만 이것이 작동할 방법은 생각나지 않습니다.내가 생각할 수 있는 유일한 방법은 다음과 같이 UserRepository를 구현하는 것입니다.

public class UserRepository : DecoratorRepository<T>, IUserRepository
{
    protected IRepository<T> Repository { get; set; }

    public UserRepository(IRepository<T> innerRepository)
    {
        Repository = innerRepository;
    }
}

이는 의존성 주입을 사용하여 장식된 저장소를 생성하고 이를 UserRepository의 생성자에 전달한 다음 이를 작업을 실행하는 저장소로 사용한다는 의미입니다.이것은 효과가 있지만 여전히 이상적이라고 생각하지 않습니다.

그래서 제 질문은 이것이 이 작업을 수행하는 유일한 방법이라는 점에서 제가 옳았는가입니다. 아니면 제가 이것을 올바르게 이해하지 못하고 있거나 모두 함께 뭔가를 놓치고 있는 것입니다.또한 이전에 이 문제에 직면한 적이 있다면 이 문제를 어떻게 해결했습니까?

도움이 되었습니까?

해결책

당신이 사용할 경우 데코레이터 그것은 맞습니다. 각 데코레이터에는 Irepository의 인수가있는 생성자가 있으며 장식중인 내부 저장소에 대한 호출 주변의 로깅 또는 트랜잭션 코드를 호출합니다.

당신이 고려할 수있는 대안으로서, 나는 우리의 경험이 거의 없다는 것을 측면 지향적 프로그래밍입니다. 이 시나리오에서는 사용하려는 로깅 또는 트랜잭션 메소드를 나타내는 클래스에 속성을 적용합니다. 어느 시점에서 이러한 방법은 코드에 직조됩니다. 이는 추가 컴파일 단계 또는의 경우에 수행 할 수 있습니다. SpringFramework.net 주사시.

다른 팁

다양한 가져오기, 추가, 업데이트, 삭제에 대한 로깅을 처리하고 이를 가상으로 만든 다음 그로부터 상속하는 LoggingRepository 추상 기본 클래스를 가질 수 없습니까?

당신이 이것을 시도했을 수도 있다고 생각하는데 어떤 문제를 해결하려고하는지 잘 모르겠습니다.트랜잭션을 래핑할 수도 있지만 NHibernateRepository에서 그렇게 하고 싶을 가능성이 가장 높습니다.

이 블로그 문제에 대한 해결책처럼 보입니다. 그것은 기본적으로 보호 된 Irepository를 갖는 대신 개인을 비공개로 만드는 것을 제외하고는 기본적으로 동일한 디자인입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top