2012-03-09 2 views
1

DI에서 클래스를 구현하려고하지만 디자인이 적절하지 않을 수 있습니다.특정 상황에서 DI 구현

난 그냥이 상황에서 DI를 구현할 수있는 방법을하지 않는

public partial class Doer 
{ 
    private static readonly DoerRepository repository = new DoerRepository(); 

    public static IEnumerable<Doer> GetActiveDoers() 
    { 
     return repository.Doers.Where(c => c.Person.IsActive); 
    } 
} 

내가

class DoerValidation 
{ 
    public DoerValidation() 
    { 
     compileData(); 
    } 

    private void compileData() 
    { 
     doersActive = Doer.GetActiveDoers(); 
     //... 
    } 
} 

에 DI를 추가 할 클래스 그리고 내 Doer 클래스의와 관계있는 코드입니다. 어쩌면 GetActiveDoers 방법이 나쁜 디자인입니까? 그렇지 않으면이 방법을 어디에 두겠습니까?

리포지토리에 직접 새 메서드를 추가하는 것이 좋습니다. 어떤 사람들은 단지 구현 있도록 청결 유지해야 하더군요이

당신은 기본적으로 DoerRepository DoerValidation에 주입해야 할 것 소리
public interface IDoerRepository 
{ 
    IQueryable<Doer> Doers { get; } 
    void SaveDoer(Doer doer); 
    void DeleteDoer(Doer doer); 
} 

답변

2

- 생성자로 전달합니다.

GetActiveDoers과 정적 변수는 DI, IMO의 원칙에 어긋납니다.

+0

도움 주셔서 감사합니다. 이 경우 원칙을 따라갈 수있는 것에 조금 확장 할 수 있습니까? – Mathieu

+0

+1 "DI 원칙에 위배됨" 더 동의 할 수 없습니다. –

+1

@Mathieu : DoerValidation은 효과적으로 DoerRepository에 의존합니다. 따라서 생성자에 전달하여 삽입하십시오. 'GetActiveDoers'를'DoerRepository' 자체에 인스턴스 메소드로 넣거나,해야한다면 가능하면 그것을 확장 메소드로 만듭니다. –

1

정적 메서드 및 속성은 기본적으로 절차 적입니다. 정적으로 GetActiveDoers() 메서드를 노출하면 기능을 삽입 할 방법이 없습니다. 클라이언트는 필요에 따라이를 무시하거나 인라인으로 사용할 수 있습니다.

DI 및 정적 구현을 ​​사용하는 경우 해당 정적 클래스에 대한 인스턴스 래퍼를 작성하고 인스턴스 래퍼를 삽입해야합니다.

관련 문제