Проблема добавления служб отражения ASP.NET MVC CORE - PullRequest
0 голосов
/ 11 октября 2018

Я использую 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));
}

и теперь все отлично работает:)

...