0

나는 분자 유형별로 다른 화면 (WPF)을 표시하는 간단한 시스템을 가지고 있습니다. 사용자는을 선택합니다. 이를 위해 Caliburn.Micro와 Iof Container로 Autofac을 함께 사용하고 있습니다.Autofac 자체 레지스터 TypedNamedAndKeyedServices

는 간단한 명명 규칙이 예상된다

[MoleculeName] < -> [MoleculeName] 뷰 모델 -> [MoleculeName]보기

Caliburn.Micro 뷰/뷰 모델 규칙을 제공

내 목표는 분자 < -> MoleculeViewModel 부분을위한 대회를 재현하는 것입니다.

각 분자는 형태로 표현되고 IMolecule

public Interface IMolecule {...} 

IOC의이 AutoFac에 의해 제공된다 상속과 잘 다음 작품 :

그래서
private void ConfigureMoleculesLibs(Autofac.ContainerBuilder builder) 
{ 
    var builder = new ContainerBuilder(); 

    // get assemblies 
    var assemblies = AppDomain.CurrentDomain.GetAssemblies(); 

    // register molecules 
    builder 
    .RegisterAssemblyTypes(assemblies) 
    .Where(t => t.IsAssignableTo<IMolecule>()) 
    .AsSelf(); 

    // register molecules view models 
    builder 
    .RegisterType<H2SO4MoleculeViewModel>() 
    .Keyed<Type>(TypeOf(H2SO4Molecule)); 
    builder 
    .RegisterType<HClMoleculeViewModel>() 
    .Keyed<Type>(TypeOf(HClMolecule)); 
    builder 
    .RegisterType<H2oMoleculeViewModel>() 
    .Keyed<Type>(TypeOf(H2oMolecule)); 

} 

다음이 허용된다 :

public class MoleculeWrapperViewModel : Screen 
{ 
    public delegate MoleculeWrapperViewModel Factory(IMolecule molecule); 

     public MoleculeWrapperViewModel(
     IIndex<Type, Screen> moleculeScreensLookup, 
     IMolecule molecule) 
    { 
     this.MoleculeViewModel = moleculeScreensLookup[molecule.GetType()]; 
    } 

    public Screen MoleculeViewModel { get; private set; } 
} 

Caliburn이 Views와 ViewModels 사이에서하는 것과 같은 방식으로 이름을 해당 ViewModel과 일치시킴으로써 Keyed Types를 자동으로 등록 하시겠습니까?

답변

0
는 해당 AutoFac 일반적인 방법

당신은 당신의 typenames을 생성하기 위해 분자 유형을 사용할 필요가 거라고

모든 분자 유형을 반복하고 호출하기 위해 여기에 반사의 비트를 사용하려는 것 소리

:

에게
var viewModelTypeName = moleculeTypeName + "ViewModel"; 

Type yourViewModelType = Type.GetType(viewModelTypeName); // Not 100% on the syntax here, don't have VS open :P 

Type type = typeof(ContainerBuilder); 
MethodInfo miGeneric = type.GetMethod("RegisterType"); 

MethodInfo mi = miGeneric.MakeGenericMethod(yourViewModelType); 

mi.Invoke(...) // etc 

(아마도 유형 등록 개체일까요?)을 체인 방식으로 처리 했으므로 좀 더 복잡합니다. 첫 번째 호출 등의 반환 개체에 대해 제네릭 메서드를 제공해야합니다.

아직 이와 같은 방법을 사용해 보셨습니까? AutoFac가 상자 밖으로 이런 일을 지원하는 경우

확실하지 - (?하지만 일부 정규식 마법과 아마 적은 제네릭)하지만 기본적으로이 모든 CM가하고있다