2

this stackoverflow question에서 알았는데 프리즘/유니티는 제가 생각한 것처럼 디커플링되지 않았습니다., 예. 생성자에 menuManager가 삽입 된이 클래스가 있다면 이 클래스가 실제로 어딘가에 존재하는지 확인하십시오. (클래스를 포함하는 .dll을 가져올 수 있다고 생각하고 컨테이너는 제안 된 나는 아무것도하지 않습니다 만 유지하는 NullMenuModule을 할 수있는 응용 프로그램이 그 밖에 MenuModule없이 실행 (또는 수 없습니다 : 그것은, 예를 들면 그 자리에 널) 주입 :Prism에서 모듈을 느슨하게 참조하여 존재 여부를 확인할 수 있습니까?

public class EmployeesPresenter 
{ 
    public EmployeesPresenter(IMenuManager menuManager) 
    { 

    } 
} 

을하지만 그 다룰 수 응용 프로그램이 중단됨).

그러나 건물중인 응용 프로그램은 MenuManager 클래스을 MenuModule에 포함하고 있으며 모든 모듈은 MenuManager를 사용하여 메뉴에 모든 항목을 등록해야합니다. 그러나 을 교환 할 수 있기를 원합니다. MenuModules 예. InfragisticsMenuModule이 내가 예에서 오전 때 등 TelerikMenuModule, 그러나

을 가지고 CustomersModule, TelerikMenuModule을 사용하려면 을 참조해야합니다. 그리고 InfragisticsMenuModule을 사용하려면이를 참조해야합니다. 나는 새로운 참조, 예를 들어, 모든 내 모듈을 다시 컴파일하지 않고 InfragisticsMenuModule와 "핫 스왑"TelerikMenuModule 수있을 것입니다 방법에 따라서

이와

Application.exe 
Customers.dll 
TelerikMenuModule.dll 

: 나는 이것을 대체 할 응용 프로그램을 다시 시작할 수 단순히

Application.exe 
Customers.dll 
InfragisticsMenuModule.dll 

그리고 그것은 새로운 InfragisticsMenuModule.dll으로 실행하고 불평하지 않는 TelerikMenuModule.dll 없음 더 이상 존재합니다. . 해당 인터페이스를 참조 할 수

public interface IMenuSystem 
{ 
    // whatever operations need to be offered by a menu system 
} 

Application.exeCustomers.dll :

답변

5

이것은 인터페이스가 와서 어디 당신이 좋아하는 뭔가가 필요합니다. 특정 구현에 대해 알 수 없습니다.

그런 다음 구성 단계 (Register... 메서드 호출 또는 구성 파일 사용)를 사용하여 MenuSystem 구현을 제공 할 유형을 지정합니다.

+0

@ Earwicker :하지만 어떻게 구현할 것인가? "어떻게 Register"를 호출 할 것인가? 유니티 문서에서 "How to : 설정 파일 또는 WPF의 디렉토리에서 모듈 카탈로그 채우기"절을 읽었습니다. –

+0

네, 맞습니다. –

+2

이것은 올바른 기술입니다. 셸에서는 IMenuSystem을 구현하는 컨테이너에 개체를 등록합니다. "클라이언트"모듈은 단지 IMenuSystem이 필요하다고 선언하고 쉘은 Infragistics에 대해 알고 있거나 Telerik에 대해 알고있는 구현을 삽입합니다. 각 모듈은 인터페이스 정의가 포함 된 "계약"DLL을 참조 할 때만 필요합니다. 이것은 100 % 정답입니다. 우리는 우리 자신의 프로젝트에서 이것을하고 있으며 훌륭하게 작동합니다. –

2

MEF는 여기에 마음에 듭니다. 이와 같은 것들을 위해 설계되었습니다. Unity를 사용할 기회가 없었으므로, 이와 같이 (즉, IMenuModule 구현을위한 디렉토리를 스캔하는) 무언가가 포함되어 있는지 확신 할 수는 없지만 MEF는이를 수행 할 수 있습니다.

또한이 IMenuModule을 공용 어셈블리 (다른 어셈블리와 별도)에 배치하는 것이 좋습니다. 나는 보통이 일을 불렀다 .Core.dll.

따라서 Application.exe, Customer.dll, Application.Core.dll 및 특정 MenuModule 구현이있을 수 있습니다.

특정 MenuModule 구현은 Application.Core 어셈블리를 참조하여 해당 IMenuModule 인터페이스에 액세스하고 거기에서 구현합니다.

+0

말이 맞으므로 (1) IMenuModule로 Application.Core.dll을 만들고 (2) InfragisticsMenuModule을 "MenuModule : IMenuModule"로 만들고 Hard.dll Application.Core.dll 및 (3) Customers.dll을 만듭니다. Application.Core.dll에 대한 하드 참조를 수행합니까? Application.Core를 가지고 있고 모든 인터페이스를 응용 프로그램 자체에 두지 않는 이유는 무엇입니까? –

+0

그냥 버릇이 없어요. :) 원한다면 응용 프로그램 자체에 넣을 수 있습니다. –

+0

내 개체를 등록 할 때까지 작동합니다. container.RegisterType (new ContainerControlledLifetimeManager()); 그런 다음 InfragisticsModule에 대한 하드 참조가 필요합니다. –

관련 문제