대부분의 상황에서와 같이 : 상황에 따라 다릅니다.
그러나 모든 경우의 99 %에서 인터페이스를 자체 어셈블리에 배치하고 논리적 단위로 그룹화하여 엄격한 인터페이스 종속성을 방지했습니다. 전날에는 첫 번째 구현이 있던 곳에 넣었습니다. 이것은 나중에 분리 될 수없는 단단히 결합 된 엉망으로 성장했습니다.
느슨한 커플 링을 연습하고 노력한다면 별도의 인터페이스로 인터페이스를 이동하는 것이 좋습니다. I만을 선호 가 포함
이것은 하나의 어셈블리에서만 사용되는 내부 인터페이스 (인터페이스의 1 %)에는 적용되지 않습니다. 인터페이스 자체가 하나 같이 동일한 어셈블리에 포함 할 수
유일한 구현이 :
- 당신은에 물건을 포함하지 않는 (다른 비 - 인터페이스 어셈블리에 의존하지 않는 사용하고 싶지 않은 하나의 구현에만 필요한 인터페이스 어셈블리를 사용하십시오.)
- 은 본체에서 참조해야하는 "구현 어셈블리는"다른 어셈블리는 인터페이스 어셈블리를 포함하는 기본의 일종 또는 무 조작 구현
입니다. 또한 구현을 직접 사용하지 않거나 인터페이스가이 특수 구현인지 테스트합니다.
왜? 이렇게하면 어셈블리가 안정된 어셈블리에만 의존하고 단단히 결합되지 않습니다. 의존성 주입을 사용하려는 경우에도이 방법을 사용하는 것이 좋습니다.
네임 스페이스 :
당신은 인터페이스의 하위 네임 스페이스의 구현을 넣어해야합니다. 따라서, 귀하의 예를 데리러, 내가 좋을 것 :
- 가 제대로라는 이름의 구현을 넣어
MyCompany.AccountPackage.MasterAccounts
- 에서이 인터페이스의 확장 방법, 다른 안정적인 물건을 넣어
MyCompany.AccountPackage.MasterAccounts
- 의 인터페이스를 가하고 하위 네임 스페이스
MyCompany.AccountPackage.MasterAccounts.SQLMasterAccounts
또는 단지 MyCompany.AccountPackage.MasterAccounts.Implementation
.
왜?
구현 측면에서 보면 using MyCompany.AccountPackage.MasterAccounts.Interfaces
을 사용할 필요없이 모든 인터페이스와 확장 프로그램을 사용할 수 있습니다.
클라이언트 측면에서 이것은 구현 어 그리이스 (어쨌든 다른 구현 어 셈 블리를 포함해서는 안 됨)에서 인텔리 센스의 너무 많은 옵션으로부터 보호되지만 주 어셈블리의 구현에 쉽게 액세스 할 수 있다는 것을 의미합니다. 사용할 구체적인 구현을 선택합니다.
인터페이스를 완료 한 모든 과정과 자습서에서 항상 –
클래스 바로 위에 배치됩니다. 자신의 네임 스페이스 또는 라이브러리를 제공하지 않을 것입니다. 슈퍼 영리한 사람들 중 한 명이 * .NET Framework Design Guidelines *에서 논쟁 한 것처럼 (어느 것이고, 내 책이 편리하지 않다는 것을 기억하지 못한다.) 인터페이스를 제공해서는 안된다. 그 인터페이스. 따라서 인터페이스를 구현과 동일한 네임 스페이스에 배치하십시오. –
즉, 나는 실제로 당신이 쓰는 인터페이스의 수를 최소화하려고 노력할 것이고, 가능하다면 추상적 인 클래스를 선호한다. 이렇게하면 인터페이스의 거의 모든 장점을 얻을 수있을뿐만 아니라 많은 메소드에 대한 기본 구현을 제공 할 수 있습니다. 그러나 이것은 정말로 주관적입니다. 나는 그것이 SO에 적합한 주제인지 확신 할 수 없다. –