Tüm iş sınıflarımın (onları komut ve sorgu sınıfları olarak adlandırıyorum) Windsor ile çözülmesini sağlayan bir birim sınaması oluşturmaya çalışıyorum. Aşağıdaki birim test var:Türleri yansıtma yoluyla geçerken <> c_DisplayClass türlerini nasıl filtrelerim?
[TestMethod]
public void Windsor_Can_Resolve_All_Command_And_Query_Classes()
{
// Setup
Assembly asm = Assembly.GetAssembly(typeof(IUnitOfWork));
IList<Type> classTypes = asm.GetTypes()
.Where(x => x.Namespace.StartsWith("MyApp.DomainModel.Commands") || x.Namespace.StartsWith("MyApp.DomainModel.Queries"))
.Where(x => x.IsClass)
.ToList();
IWindsorContainer container = new WindsorContainer();
container.Kernel.ComponentModelBuilder.AddContributor(new SingletonLifestyleEqualizer());
container.Install(FromAssembly.Containing<HomeController>());
// Act
foreach (Type t in classTypes)
{
container.Resolve(t);
}
}
Bu şu istisna ile başarısız:
No component for supporting the service MyApp.DomainModel.Queries.Organizations.OrganizationByRegistrationTokenQuery+<>c__DisplayClass0 was found
Ben <>c__DisplayClass0
tip Derlenmekte Linq nedeniyle olduğunu anlıyoruz, fakat nasıl gömmek olmadan bu tür filtreleyebilirsiniz Linq sorgumdaki ad?
sınıfları yerine meclisleri düşünüyordum. Hayatı biraz daha basit hale getirmek için 'type.IsDefined' kullanabilirsiniz. –
@Jon, Teşekkürler! İsDefined'i hatırlamalıyım ... Çok daha özlü! –
Kod çalışıyor Yansımayı kullanarak çalışan VS2015 beri kırık olabilir! MethodCall'dan doğru İfade (bir 'List') döndüren bir kod var. Şimdi bir <> c__DisplayClass36_0) .CS $ <> 8__locals1' döndürüyor. Bu bir 'MemberExpression' olduğunu unutmayın (bir değer olarak listeyi içeren bir ConstantExpression' idi)). Şimdi bu ek indirgemeyi takip etmeli ve daha sonra listemizi almak için "CS $ <> 8__locals1" alanının değerini almalıyım. –