Prism / Composite Application 라이브러리에서 모듈을 동적으로로드하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1420539

문제

나는있다 수업 내 프리즘/cal 응용 프로그램에서 양식을 생성합니다 사용자가 데이터를 채우기 위해.

양식은 An에 의해 정의됩니다 XML 다음과 같은 파일 :

<area idCode="general" title="General">
    <column>
        <group title="Customer Data">
            <field idCode="title" requiredStatus="true">
                <label>title</label>
                <fieldType>Title</fieldType>
            </field>
            <field idCode="firstName" requiredStatus="true">
                <label>First Name</label>
                <fieldType>Text</fieldType>
            </field>
            <field idCode="lastName" requiredStatus="true">
                <label>Last Name</label>
                <fieldType>Text</fieldType>
            </field>
            <field idCode="email" requiredStatus="true">
                <label>E-Mail</label>
                <fieldType>Email</fieldType>
            </field>
            ...
        </group>
        </column>
    </area>

양식이로드되어야합니다 특정한 각각에 해당하는 컨트롤 필드 유형 XML에서

  • 제목 (드롭 다운 표시 : Mr., Mrs., Dr. 등)
  • 텍스트 (간단한 텍스트 상자)
  • 이메일 (전자 메일 검증이있는 텍스트 상자)
  • 우편 번호 (우편 번호 검증이있는 텍스트 상자)

각 컨트롤을 별도의 모듈로 만들고 싶습니다. 우편 번호 모듈은 모듈 디렉토리에 파일로 존재합니다.

ZipCode.dll

그냥 a 간단한 텍스트 상자 지퍼 코드를 기반으로 검증하는 제어는 다음과 같이 불러야합니다.

ZipCodePlus.dll

상속 동일한 인터페이스 그러나 Zipcodes에 대한 팝업 Geo-Earth 선택기를 제공합니다. 고객이 교체하자마자 zipcode.dll ~와 함께 zipcodeplus.dll, 그의 모든 형태는 이것을 가질 것입니다 새로운 기능 우편 번호 검색 용.

그러나 양식 클래스가 XML을 구문 분석하기 때문에 컨트롤에 대한 기능을 제공하는 클래스를 인스턴스화하지만 인스턴스화 수업에는 a가 있어야합니다 참조 그것에 :

SmartFormFieldZipCodePresenter smartFormFieldEmailPresenter
    = container.Resolve<SmartFormFieldEmailPresenter>();

그러나 어떻게 인스턴스화 할 수 있습니까? 동적으로, 즉 클래스의 이름을 가진 , 그리고 그 클래스가 존재하지 않으면 적절한 것을 던질 것입니다. 예외, 예 : 이와 같은 것 :

의사 코드 :

try {
    var smartFormFieldZipCodePresenter
        = container.Resolve("smartFormFieldZipCodePresenter");
}
catch (ModuleDoesNotExistException) {
    ...
}
도움이 되었습니까?

해결책

문제에 대한 기술적 인 솔루션에 매우 가깝습니다. 나는 단순히 인터페이스를 만들 것입니다 - IZipCodePresenter - 그리고 내 zipcode.dll 또는 zipcodeplus.dll 모듈 스타트 업에서 구현을 등록하십시오.

Container.RegisterType<IZipCodePresenter, StandardZipCodePresenter>();

그런 다음 파서에서 다음과 같은 인스턴스를 해결하십시오.

var zipCodePresenter = container.Resolve<IZipCodePresenter>();

인터페이스에 인스턴스가 등록되어 있지 않다고 가정하면 예외가 발생합니다. 그렇지 않으면 izipcodepresenter의 마지막 등록 콘크리트 구현을 얻게됩니다. 인터페이스를 시도하고 등록하는 경우에만 예외가 발생합니다. Unity에 클래스를 등록하려고하면 평생 관리자 정책을 기반으로 인스턴스를 만듭니다.

이것으로 더 나아가고 싶다면, 당신은 인터페이스를 만들 수 있습니다 ... idynamicpresenter와 같은 것. 그런 다음 알려진 문자열을 기준으로 등록 할 수 있습니다 (인프라 프로젝트에 정의 됨).

Container.RegisterType<IDynamicPresenter, StandardZipCodePresenter>(PresenterName.ZipCodeControl);
Container.RegisterType<IDynamicPresenter, StandardEmailPresenter>(PresenterName.EmailControl);

그런 다음 다음과 같이 해결하십시오.

var zipCodeControl = Container.Resolve<IDynamicPresenter>(PresenterName.ZipCodeControl);
var emailControl = Container.Resolve<IDynamicPresenter>(PresenterName.EmailControl);

나는 이전 솔루션을 선호하지만 이것은 확실히 유효한 옵션입니다.

도움이 되었기를 바랍니다!

추신 : 이것은 흥미로운 아이디어처럼 들립니다 ... 구현에 어떻게 참여하는지 듣고 싶습니다. ASP.NET MVC의 일부 개념을 기반으로 한 걸음 더 나아가서 전체 XAML 빌더 프레임 워크를 만들 수도 있습니다. 테스트의 용이성을 용이하게 할 수 있지만 WPF의 힘을 가질 수 있습니다. 행운을 빕니다!

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