2016-10-16 14 views
0

나는 하나의 솔루션에 com.comman, com.business, another solution에 com.xyz의 세 가지 프로젝트가 있습니다.다른 클래스의 생성자에서 클래스를 주입하는 방법은 무엇입니까?

com.comman에서 나는 로거 말을 할 수있는 클래스가 하나 있는데, 생성자에서 하나의 매개 변수를 사용합니다. 그래서 com.business에서 나는 commans DLL을 참조하고 logger obj를 다음과 같이 작성합니다. var obj = 새로운 로거 ("MIS");

이렇게하면 com.xyz에서 logger 객체를 만들고 싶지만 com.comman dll은 참조하지 않아도됩니다. 이것을 달성 할 수 있습니까?

참고 : com.business 프로젝트에서 나는 com.xyz의 다른 클래스 "PQR"을 다시 호출하는 "ABC"라는 클래스 중 하나를 호출합니다. PQR 클래스에서 로거 객체를 만들고 싶습니다.

나를 안내하십시오! com.xyz 다른 솔루션에 그 솔루션은 이미 com.xyz에서 다스 려하기 때문에

+0

다른 솔루션이나 프로젝트에 대해 이야기하고 있습니까? 나는 당신이 다른 프로젝트를 참조하지 않고 그것을 할 수 있다고 생각하지 않는다. DLL을 동적으로로드하고 참조를 사용하지 않으려는 경우 리플렉션을 사용할 수 있습니다 .. –

+0

예, 두 가지 솔루션 인 com.comman, com.business는 하나의 솔루션에 포함되어 있으며 com.xyz는 다른 솔루션에 있습니다. – Freelancer

답변

0

나는, 해당 어셈블리 com.xyz 조립 com.comman을 참조 할 수 없습니다 가정합니다.

즉, PQR 클래스는 com.comman.Logger에 종속 될 수 없습니다. 그래도 그 로거를 PQR에 주입 할 수 있기를 원합니다.

해결 방법은 com.xyz에 추상화/인터페이스를 정의하고 해당 인터페이스에 PQR을 의존시키는 것입니다. 예를 들어 :

// Logger abstraction specifically tailored at the needs of com.xyz 
public class ILogger { 
    void Log(string message); 
} 

public class PQR { 
    private readonly ILogger logger; 
    public PQR(ILogger logger) { 
     if (logger == null) throw new ArgumentNullException("logger"); 
     this.logger = logger; 
    } 
    // PQR methods 
} 

이 새로운 com.xyz.ILogger 추상화의 존재는 com.xyz.ILogger에서 com.comman.logger에 매핑하는 어댑터를 만들 수 있습니다. 이 어댑터는 com.business의 솔루션에 있어야합니다. 가장 바람직한 장소는 Composition Root입니다. Composition Root는 com.business을 참조하는 어셈블리 일 수 있지만 com.business이 시작 프로젝트 인 경우 어댑터를 만들 수 있습니다.

로 보일 수 있습니다이 어댑터는 다음과 같습니다 : 지금이 작업을 수행해야합니다

당신이합니다 ( com.business 솔루션)을 PQR 클래스를 만들 위치에
public class ComXyzLoggerAdapter : com.xyz.ILogger { 
    private com.comman.logger logger; 
    ComXyzLoggerAdapter(com.comman.logger logger) 
     this.logger = logger; 
    } 

    public void Log(string message) { 
     // Here we map from com.xyz.ILogger to comman.Logger 
     this.logger.LogError(message); 
    } 
} 

:

var abc = 
    new ABC(
     new QPR(
      new ComXyzLoggerAdapter(
       new com.comman.logger("MIS")))); 

을 우리 여기에 기본적으로 Dependency Inversion Principle이 적용되었습니다.

+0

이것은 내가 찾고 있었던 것이다. 감사합니다! – Freelancer

관련 문제