문제

방금 NDC에서 Bob Martin의 에피소드를 보았습니다. 그는 페이지 상단의 C#에 "사용"지시문이 구성 요소간에 생성/암시하기 때문에 나쁘다고 말했습니다.

프로젝트 참조와 사용 명령문을 추가하지 않고 외부 .dlls를 사용하는 방법은 무엇입니까?

나는 v6을 progid의 문자열로 만들 수있는 v6을 기억합니다. 그것이 내가 찾고있는 기술인지 확실하지 않지만 DLL.

편집하다: 회의에 대한 링크가 있습니다. 프레젠테이션에 정확한 견적이나 분이 없어서 미안합니다. 기억으로 가고 있습니다.

도움이 되었습니까?

해결책

그것은 나쁜 진술 자체가 아닙니다. 너무 많아 그들의.

다음과 같은 진술 using System; 그 자체로는 거의 문제가되지 않지만 같은 코드 파일에 많은 문제가있는 경우 단단한 커플 링 표시.

프로젝트 자체의 참조 수에 비슷한 경험 법칙을 적용 할 수 있습니다.

단단한 커플 링 솔루션은 다음과 같습니다 인터페이스에 프로그래밍 및 의존성 주입 (DI).

VB에서 기억할 수있는 일을하는 프로그램은 단순히 행동이었습니다. 본질적으로, 당신은 해당 프로그램을 사용하여 원하는 인터페이스를 구현 한 인스턴스에 대한 참조를 얻었습니다. 단점은 COM 객체가 보편적으로 등록되었을 때만 효과가 있다는 것입니다. DLL 지옥을 기억하십니까?

DI의 특정 맛을 사용하여 동일한 원리를 적용 할 수 있습니다. 이제 인터페이스는 .NET 유형이며 IDL로 정의되지 않았으며 콘크리트 구현을 공급하려면 일종의 DI 컨테이너가 필요합니다.

다른 팁

나는 Bob Martin이 실제로 초기와 늦은 바인딩을 언급하고 있다고 생각합니다.

.NET에서 반사를 통해 후기 바인딩이 가능하며, 특히 파일 이름 또는 어셈블리 이름을 사용하여 외부 어셈블리에서 유형을 생성 할 수있는 활성기 클래스를 통해 가능합니다.

일반적으로, 사용 명령문이 아닌 지시문 사용은 외부 어셈블리를 직접 참조하는 것과 함께 진행됩니다. 즉. 어셈블리에 대한 참조를 추가 한 다음 외부 유형을 사용할 때 풀 네임 스페이스 계층 구조를 입력 할 필요가 없도록 지시문을 사용하여 추가합니다.

따라서 코드에 상단에 지시문을 많이 사용하는 경우 많은 다른 유형을 직접 참조하고 이러한 유형에 대한 코드의 커플 링/종속성을 증가시킬 수 있습니다.

나는 이것이 밥이 그것들을 나쁜 것으로 언급하는 이유라고 생각합니다. "이것이 실제로 나쁘다"라는 질문에 대한 대답. 매우 주관적이고 맥락 의존적 인 것입니다.

그러나 일반적으로 구성 요소의 디퍼링은 거의 항상 소프트웨어 설계를 목표로하는 좋은 목표입니다. 이는 시스템의 나머지 부분에 미치는 영향으로 시스템의 일부를 변경할 수 있기 때문입니다. Bob Martins 책 중 하나를 읽은 후, 나는 이것이 그가 얻는 것임을 기대할 것입니다.

using 네임 스페이스에 대한 바로 가기 일 뿐이며 외부 파일에 대한 참조가 아닙니다. 그러므로 이것은 실제로 의미가 없습니다.

어쨌든, 할 수있는 일에는 인터페이스 DLL (인터페이스 만있는 DLL)이 있으므로 다른 어셈블리를 동적으로로드하고 사용하고 잘 알려진 인터페이스에 캐스트 할 수있는 유형 (반사)을 작성하십시오. 이것은 강력하게 입력 된 언어와 초기 구속력을 유지하면서 외부 참조를 풀는 적절한 방법입니다.

살펴보십시오 집회 그리고 AppDomain 어셈블리로드 클래스 및 활성기 이름으로 유형 인스턴스를 작성합니다.

반사를 사용할 수 있습니다.

// Load the assembly
Assembly assembly = Assembly.LoadFrom(@"c:\path\Tools.dll");
// Select a type
Type type = assembly.GetType("Tools.Utility");
// invoke a method on this type
type.InvokeMember("SomeMethod", BindingFlags.Static, null, null, new object[0]);

반사를 통해 당신이 말하는 것을 할 수 있습니다. 런타임에 어셈블리를로드하고 반사하여 클래스 등을 얻고 동적으로 호출 할 수 있습니다.

개인적으로, 나는 커플 링을 피하기 위해 이것을하지 않을 것입니다. 나에게 그것은 반사의 나쁜 사용이며, 그렇게하지 않는 특정한 이유가 없다면, 나는 그것을 프로젝트에 추가하고 참조 할 것입니다. 반사는 시스템에 오버 헤드가 추가되며 컴파일 타임 안전의 이점을 얻지 못합니다.

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