Регистрация и разрешение зависимостей по запросу на основе параметра (Autofa c WEB API) - PullRequest
0 голосов
/ 09 июля 2020

У меня есть приложение с автоматическим внедрением зависимостей c, и я хотел использовать специальное c расширение dll на основе параметра, который у меня есть в запросе.

Вот мой global.asax, где я инициализирую autofa c.

var containerBuilder = new ContainerBuilder();
containerBuilder.RegisterApiControllers(Assembly.GetExecutingAssembly());
containerBuilder.RegisterModule<ExModule>();            

var container = containerBuilder.Build();

container.Resolve<IArtigoErp>();

Вот модуль autofa c, в который я загружаю регистр моей DLL

public class ExModule : Autofac.Module
{
    protected override void Load(ContainerBuilder builder)
    {
        //Load DLL1 from folder and register it
        RegistaDepedencias<IArtigoErp>(builder, "DLL1");

        //Load DLL2 from folder and register it
        RegistaDepedencias<IArtigoErp>(builder, "DLL2");

        
    }

    private void RegistaDepedencias<T>(ContainerBuilder builder, string NomeDll)
    {
        RegisterDep<T>(GetEnumerableTypes<T>(NomeDll), builder);
    }

    private void RegisterDep<T>(IEnumerable<Type> types, ContainerBuilder builder)
    {
        foreach (var t in types)
        {
            builder.RegisterType(t).As<T>();
        }
    }

    private IEnumerable<Type> GetEnumerableTypes<T>(string NomeDll)
    {
        return Directory.EnumerateFiles(Path.Combine(HostingEnvironment.ApplicationPhysicalPath, "Engine"))
            .Where(x => x.Contains(NomeDll) && x.EndsWith(NomeDll +".dll"))
            .Select(x => Assembly.LoadFrom(x))
            .SelectMany(x => x.GetTypes()
                .Where(t => typeof(T).IsAssignableFrom(t) && t.IsClass));
    }
}

Обе мои DLL имеют класс, который расширяется от IArtigoErp.

Итак, идея состоит в том, что, основываясь на параметре, который я получаю по моему запросу, я хочу запустить метод либо в DLL1, либо в DLL2. Пример:

if(param == 1)
   _artigoErp.GetLista(); // In DLL1
if(param == 2)
   _artigoErp.GetLista(); // In DLL2

EDIT 1:

Параметр берется из метода публикации следующим образом (Guid IdLoja)

public class ArtigoController : ApiController
{
    private readonly IArtigoErp _artigoErp;
    private readonly IArtigoLoja _artigoLoja;

    public ArtigoController(IArtigoErp artigoErp, IArtigoLoja artigoLoja)
    {
        _artigoErp = artigoErp;
        _artigoLoja = artigoLoja;
    }

    [Route("PostArtigos")]
    public CallResponse PostArtigos([FromBody] Guid IdLoja)
    {
    }
}

Я думаю, мы также можем обработать это в методе begin_request в global.asax

Заранее спасибо.

...