2017-12-21 62 views
0

이 질문을 올바르게 표현하지는 못했지만 의도를 잘 이해할 수 있습니다.참조 어셈블리를 기반으로 사용할 수있는 특성을 제한하십시오.

세 개의 프로젝트가있는 응용 프로그램이 있습니다. 프로젝트 1은 애플리케이션의 웹 지향적 인 부분입니다. 프로젝트 2는 정보에 액세스하기위한 API입니다. 프로젝트 3은 데이터베이스에 액세스하여 정보를 얻고 해당 정보를 호출자에게 반환하는 부분입니다.

프로젝트 1에서 웹 사이트에서 사용할 정보에 액세스하고 수정하기 위해 프로젝트 3의 개체에 포함 된 메서드를 호출합니다. 예를 들어 Project 1에서 ProjectID.classes.myObject.getObject (2)를 호출하여 objectID 2에 대한 데이터베이스 쿼리를 기반으로 myObject의 인스턴스를 가져옵니다.

myObject는 프로젝트 1에서이 속성을 사용할 수 있습니다.이 속성은 모두 웹 사이트에서 반드시 볼 수있는 것은 아닙니다. 많은 것은 프로젝트 1에서 내부적으로 사용됩니다.

이제 Project 2에서이 정보를 API 호출을 통해 반환 할 수 있기를 바랍니다. . 예를 들어/controllers/myObject/2를 사용하여 API를 호출하면 Project3.classes.myObject.getObject (2)가 호출됩니다. 그러나 Project 2에서 호출 할 때 반환되는 특성을 제한하고 싶습니다.

나는 이것을 Project 2에서 반환 된 객체를 래핑하고 실제적으로 API 호출에서 반환되는 방식으로 제한함으로써이를 수행 할 수 있음을 알고있다. 그러나 Project 3 내에서이 작업을 수행 할 수있는 방법이 있습니까?

"공용"으로 특성을 선언 할 때 해당 특성을 호출하는 모든 어셈블리에서 사용할 수 있으며 "내부"로 만들면 포함 된 어셈블리에서만 사용할 수 있다는 것을 알고 있습니다. 특정 어셈블리 만 호출하는 "모든"어셈블리 대신 사용할 수있는 수정자가 있습니까?

아니면 완전히 잘못된 생각입니까?

답변

0

는 다음에서 Project1에 표시되어야하지만 internal로 프로젝트 2 할 모든 소품을 설정

프로젝트 3의 AssemblyInfo.cs에 속성

[assembly:InternalsVisibleTo(Project1)] 

을 추가하는 방법에 대한 이야기를 통해 UR처럼 보인다.

현실 세계 API에서 사용되는 것을 보았지만 실제로는 좋은 디자인이라고 생각하지 않습니다. 의도는 타사 응용 프로그램에서 숨기면서 API의 DLL간에 일부 기능을 공유하는 것이 었습니다.

https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute(v=vs.110).aspx

+0

정확하게 내가 원하는 것 같습니다. 좋은 디자인이 아니라고 생각하는 이유에 대해 조금 더 명확히 해줄 수 있습니까? –

+0

나는 코드가 매우 불분명하고 유지하기가 어렵다고 생각한다. 내부는 물건을 내부에 유지하도록 설계되었으며이 속성은 원래 내부 클래스의 단위 테스트를위한 것입니다. 각기 다른 용도와 공장을위한 2 개의 인터페이스를 생성하고 전체 구현을 내부적으로 유지하는 것이 훨씬 명확합니다. –