주어진 어셈블리에 대해 주어진 인터페이스의 모든 (속성 및 생성자) 가져 오기를 나열하는 훌륭한 MEF 방법이 있습니까?MEF - 어셈블리에 필요한 모든 가져 오기를 리플렉션없이 나열 할 수 있습니까?
[Import]
또는 [ImportingConstructor]
속성 (등등)을 확인하면서 반출 된 모든 유형을 스캔 할 수 있다는 것을 알고 있지만 MEF가 이미 알고 있다고 생각합니다.
주어진 어셈블리에 대해 주어진 인터페이스의 모든 (속성 및 생성자) 가져 오기를 나열하는 훌륭한 MEF 방법이 있습니까?MEF - 어셈블리에 필요한 모든 가져 오기를 리플렉션없이 나열 할 수 있습니까?
[Import]
또는 [ImportingConstructor]
속성 (등등)을 확인하면서 반출 된 모든 유형을 스캔 할 수 있다는 것을 알고 있지만 MEF가 이미 알고 있다고 생각합니다.
우아한은 너무 주관적이다, 그래서 나는
당신은 System.ComponentModel.Composition.ReflectionModel에 있습니다 ReflectionModelServices 클래스를 사용할 수 있습니다) = 내 솔루션은 우아함의 개념에 맞는 바랍니다. 이름에서 알 수 있듯이 Reflection을 내부적으로 사용하지만 잘, MEF의 일부이며 MEF는 리플렉션을 사용합니다.
리플렉션없이이라고 말하면 유형에 직접 반영을 사용한다고 가정합니다. 당신이 반복 다음
internal interface IFoo { }
internal class Boo : IFoo
{
[Import] public string SomeString;
[ImportingConstructor]
public Boo(int someInt) { }
}
internal class Moo : IFoo
{
[Import] public float SomeFloat;
}
당신이 당신의 카탈로그를 만드는 곳 (나를 위해 콘솔 응용 프로그램의 홈페이지에 우연히) : 그래서,
하자 우리는 다음과 같은이 있다고 ... 계속 할 수 있습니다 카탈로그의 부품 검사 각 부분의 수입 정의 :
이private static void Main(string[] args)
{
var regBuilder = new RegistrationBuilder();
regBuilder.ForTypesMatching(t => typeof(IFoo).IsAssignableFrom(t))
.Export<IFoo>();
var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly(), regBuilder);
foreach (var composablePartDefinition in catalog.Parts)
if (typeof(IFoo).IsAssignableFrom(ReflectionModelServices.GetPartType(composablePartDefinition).Value))
foreach (var importDefinition in composablePartDefinition.ImportDefinitions)
Console.WriteLine(
$"Contract name: {importDefinition.ContractName}. Is parameter (for ImportingConstructor stuff): {ReflectionModelServices.IsImportingParameter(importDefinition)}");
Console.ReadLine();
}
이의 출력은 다음과 같습니다
당신이 기수 또는 공유 정책을 알고 할 수 있습니다 예를 들어당신은 둘 다 ... =)
희망이가 할 수있는, ImportDefinition을 정의하는 다른 속성을 탐구하는 시도 할 수 있습니다.
내가 필요로하는 것은 짧고 빠르며 (MEF가 이미 그랬던 것처럼 Reflection을 두 번 실행할 필요가 없음) 유익한 정보입니다. :) –