2015-05-02 6 views
12

Это легко получить все доступные типы (например, для некоторого интерфейса) в старой .NET, но я не могу найти способ, как это сделать в новом CoreCLR.Получить доступные типы в CoreCLR

Что я хочу сделать, так это иметь функцию GetRepository, которая должна искать существующую реализацию IRepository и возвращать новый экземпляр этого типа. Реализация будет размещена в другом проекте.

Так, в .NET можно использовать что-то вроде этого:

AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes()) 

Единственное решение, которое я для CoreCLR сейчас является:

public T GetRepository<T>() 
{ 
    foreach (Type type in typeof(T).GetTypeInfo().Assembly.GetTypes()) 
    if (typeof(T).IsAssignableFrom(type) && type.GetTypeInfo().IsClass) 
     return (T)Activator.CreateInstance(type); 

    return default(T); 
} 

Но это работает только, если интерфейс и реализация являются расположенный в той же сборке (и это не мое дело).

Спасибо!

+1

Можете ли вы написать в 1 строке (комментарий), что такое CoreCLR и зачем мне это нужно? (Я знаю, что такое mscorelib) –

+0

Для меня самое главное - это возможность запуска веб-приложения на любой платформе (или в облаке или даже самообслуживании без веб-сервера), чтобы инфраструктура была разделена на небольшие обновленные пакеты независимо. Я думаю, что это небольшая революция. Вы можете прочитать больше на веб-сайте asp.net. –

+1

'AppDomain.CurrentDomain.GetAssemblies()' похоже, тоже в CoreCLR: см. [Здесь] (https://github.com/dotnet/coreclr/blob/cbf46fb0b6a0b209ed1caf4a680910b383e68cba/src/mscorlib/src/System/AppDomain.cs) – Christian

ответ

9

Итак, вот ответ от Microsoft: https://github.com/dotnet/coreclr/issues/919

Короче говоря, есть новый

Microsoft.Framework.Runtime.LibraryManager 

с

public IEnumerable<ILibraryInformation> GetLibraries(); 
public IEnumerable<ILibraryInformation> GetReferencingLibraries(string name); 

т.д.

UPD: запускаот RC2 использования Microsoft.Extensions.DependencyModel.DependencyContext вместо:

DependencyContext.Default.CompileLibraries 
DependencyContext.Default.RuntimeLibraries 
+0

Больше не работает !!! Обновите свой ответ –

+1

@AkashKava обновлен. –

+0

Не похоже, что есть замена GetReferencingLibraries (имя строки) в новом DependencyContext !!! – irperez

Смежные вопросы