Я использую MVC Core 2.1
У меня есть несколько проектов, в которых все мои проекты имеют статический класс и метод для добавления служб, например:
[AutoServiceCollection]
public static class ModuleServices
{
public static void Run(IServiceCollection services)
{
services.AddTransient<ILanguagesDA, LanguagesDA>();
}
}
Теперь я хочу запустить все ModuleServices.Run методы с помощью отражения следующим образом:
public static IServiceCollection addModuleServices(this IServiceCollection services)
{
var assemblies = AssemblyTools.AssemblyLocator.GetAssemblies();
foreach (var assembly in assemblies)
{
try
{
foreach (var cls in assembly.GetTypes())
{
var attr = cls.CustomAttributes.FirstOrDefault(x =>
x.AttributeType.Name == typeof(AutoServiceCollectionAttribute).Name);
if (attr != null)
{
var mi = cls.GetMethod("Run");
if (mi != null)
{
mi.Invoke(null, new object[] {services});
}
break;
}
}
}
catch (Exception)
{
}
}
return services;
}
И добавление метода addModuleServices в файл startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
//add modules services
services.addModuleServices();
}
После добавления всех служб в IServiceCollection путем отражения,
Я хочу получить такой сервис
public class HomeController : Controller
{
private IServiceProvider _provider;
public HomeController(IServiceProvider provider)
{
_provider = provider;
}
public IActionResult Index()
{
var langDA = (ILanguagesDA) _provider.GetService(typeof(ILanguagesDA));
}
}
Но проблема в том, что langDA переменная не заполнена и выдает это исключение
'langDA' threw an exception of type 'System.IO.FileNotFoundException'
Data: {System.Collections.ListDictionaryInternal}
FileName: null
FusionLog: null
HResult: -2147024894
HelpLink: null
InnerException: null
Message: "Cannot load assembly 'D:\\Projects\\FrameworkCore\\FrameworkCore\\bin\\Debug\\netcoreapp2.1\\Sp.Base.dll'."
Source: "0601e19325e244618b145b4d25ec19dc"
StackTrace: " at <>x.<>m0(HomeController <>4__this)"
TargetSite: {Sp.Base.DataAccess.Interfaces.ILanguagesDA <>m0(FrameworkCore.Controllers.HomeController)}
Но эта проблема только для добавления отражения, и если я добавляю сервис напрямую методом расширения в IServiceCollecion, эта работа работает правильно !!
Почему возникла эта проблема и как ее решить (я должен использовать отражение)?
[решено]
Я использовал этот код для получения списка всех сборок:
string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
foreach (string dll in Directory.GetFiles(path, "*.dll"))
{
allAssemblies.Add(Assembly.LoadFile(dll));
}
и изменил его на этот код:
string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
foreach (string dll in Directory.GetFiles(path, "*.dll"))
{
allAssemblies.Add(AssemblyLoadContext.Default.LoadFromAssemblyPath(dll));
}
и теперь все отлично работает:)