2009-08-27 5 views
2

저는 C# 초보자입니다. 그러니 나와 함께하시기 바랍니다.다른 어셈블리의 내부 인터페이스에서 파생되는 방법

OK, 그래서 서로를 참조 할 필요가 다른 어셈블리에 두 개의 클래스가 있습니다

namespace AssemblyA 
{ 
    class A 
    { 
    private B MyB { get; set; } 
    } 
} 

namespace AssemblyB 
{ 
    class B 
    { 
    private A MyA { get; set; } 
    } 
} 

나는 내가 인터페이스를 사용하고, 순환 참조는 허용되지 않습니다 이해 :

namespace AssemblyA 
{ 
    public interface IB 
    { 
    // whatever 'A' needs of 'B' 
    } 

    class A 
    { 
    private IB MyB { get; set; } 
    } 
} 

namespace AssemblyB 
{ 
    class B : AssemblyA.IB 
    { 
    private A MyA { get; set; } 
    } 
} 

이 방법이 효과적이지만 다른 나라에 IB이 노출된다는 단점이 있습니다. 대신 내가하고 싶은 것은 IBinternal입니다. 하지만 B은 그걸 파생시킬 수 없습니다.

C++의 경우 B을 친구로 지정하면됩니다. 나는 C#이 친구가 없다는 것을 이해한다 (말장난은 아니지만 언급 됨). 그래서 나는하지 않고해야한다. 거기에 속성이 있다는 것을 읽었지만 어셈블리의 전체가 A 어셈블리 전체에 액세스 할 수있게합니다. B은 좋지 않습니다. 피할 수있는 방법이 있습니까?

답변

4

큰 문제가 여기에 의견에 따라, 조립 B는 조립체 (A)이 부정

의 하나 명의 특정 멤버를 참조시키는 것 같다 원래 질문의 일부, 잘 문서화 된 InternalsVisibleTo 속성의 사용 가능성을 되풀이합니다.

아니면요?

IB 인터페이스가 internal으로 표시되고 자체 InternalsVisibleTo 속성이 A 및 B로 표시된 새로운 조립품 C를 만들려고하십니까?

A를 B에 모두 노출시키지 않으면 서 제어 된 방식으로 IB를 노출합니다. 나는 개인적으로 앞서 가서 A에 InternalsVisibleTo을 사용했을 것입니다. 다른 사람을 계속 지키기 위해 내적인 나머지 부분을 문서화하십시오.) 그러나 나는 당신이 어디에서 왔는지 이해합니다 - 그리고 이것은 적어도 문제를 해결합니다.

+0

존, 이것을 고려했습니다. 이 구문상의 문제를 회피하기 위해 어셈블리를 추가해야하는 것은 나에게 불행한 것 같습니다. 어쨌든, 당신이 실제로 내 질문을 읽고 제안을 한 첫 번째 사람이기 때문에 나는 이것을 투표했습니다. – sbi

+0

나는 아직도 물어볼 것입니다 - B 건물은 누구이며, 왜이 건물에 접근 할 수 있다면 다른 사람들에게 접근 할 수 없도록 만드는 것이 왜 그렇게 중요합니까? 기본적으로 아무 것도 발생하지 않습니다. 해당 개발자는 수동으로 해당 멤버를 호출해야합니다. (즉, 내 답변보다 다른 답변에 동의합니다 :)) –

+0

두 어셈블리가 모두 사내입니다. 하지만 그다지 중요하지 않습니다. 수년에 걸쳐 나는 캡슐화가 미덕이라는 것을 알게되었습니다. 나는 컴파일 타임 *에서 최대한 빨리 모든 것을 강화하고 싶다. 위의 디자인이 이상한 것으로 생각하지 않으며 C#에서이 문제를 해결할 수 없다는 사실에 놀랐습니다. – sbi

8

사실 C#/.NET은 친구 어셈블리에 대한 지원을 실제로 제공합니다. 두 어셈블리를 Friend Assemblies으로 표시하려면 MSDN에서 다음과 같이 정의하십시오.

다른 어셈블리에서 어셈블리의 내부 형식 또는 내부 멤버에 액세스 할 수 있습니다.

따라서 다음 코드를 프로젝트의 코드 파일 중 하나에두면됩니다 (AssemblyInfo.cs을 선택합니다).

[assembly:InternalsVisibleTo("name_of_friend_assembly")] 
+2

@sbi : 예, 다른 어셈블리 전체에서 모든 내부 멤버를 볼 수있는 방법은 없습니다. 그러나 왜 이것이 당신에게 유익하지 않습니까? 분명히 이런 종류의 일을하고 싶다면,이 어셈블리들은 정의상 서로를 신뢰할 수 있습니까? – Noldorin

+0

@sbi : 두 어셈블리를 모두 쓰고 있으니? .NET은 당신을 도우려고하지만 개발자의 어리 석음을 막기 위해 그렇게 할 수 있습니다. – Noldorin

+0

Hrmm ... 여기의 답은 모두 운전수 감소 혐의로 희생 된 것처럼 보이고 의견도 없습니다. – Noldorin

1
+0

"나는 그것에 대한 속성이 있음을 읽었지만, 이것은 조립품'A'의 전체를 조립품'B'에 접근 가능하게 만들 것입니다. 나는 그것을 좋아하지 않습니다." – sbi

+1

+1 무의미한 하향 투표에 대응합니다. – Noldorin

+0

@ Noldorin : 돌아가서 내 실제 질문을 읽어보십시오. 그런 다음이 답변을 읽으십시오. 생각해. 그런 다음 다시 투표하십시오. – sbi

관련 문제