Внедрение сборки с изменением сигнатур методов с использованием Autofac - PullRequest
0 голосов
/ 24 марта 2020

У меня есть сборка, которая содержит API для нашей ERP. Для простоты предположим, что он содержит код ниже

public class Foo_20190()
{
   public string Login;
   public string Password;
}

public class FooApi
{
   [DllImport("foo_api.dll")]
   public static extern int Login(Foo_20190 foo, ref int sessionId)
}

. С каждым выпуском классы в сборке меняют свои имена, даже если их поля остаются прежними. Например, Foo_20190 в следующем выпуске становится Foo_20193, и сигнатура метода Login тоже меняется

public class Foo_20193
{
   public string Login;
   public string Password;
}

public class FooApi
{
   [DllImport("foo_api.dll")]
   public static extern int Login(Foo_20193 foo, ref int sessionId)
}

Моя цель - иметь возможность просто заменить сборку в каталоге приложения-потребителя без необходимости переименуйте все вызовы на Foo_20190 и перестройте приложение.

Я пытался использовать Autofa c.

Сначала я определяю реферат Foo class

public abstract class Foo
{
   public string Login;
   public string Password;
}

Затем я сканирую правильный тип в сборке

var containerBuilder = new ContainerBuilder();

var fooApiAssembly = Assembly.LoadFrom("foo_api.dll");

containerBuilder.RegisterAssemblyTypes(fooApiAssembly)
                .Where(t => t.Name.StartsWith("Foo"))
                .As<Foo>()
                .InstancePerDependency();

Наконец, я пытаюсь получить FooApi и подключите его к самодельному интерфейсу

public interface IFooApi
{
    int Login(Foo foo, ref int sessionId);
}
containerBuilder.RegisterAssemblyTypes(fooApiAssembly)
                .Where(t => t.Name == "FooApi")
                .As<IFooApi>()
                .InstancePerDependency();

, что невозможно из-за того, что методы FooApi являются static. И даже если их не будет, сигнатура метода не совпадает.

Как я могу это сделать?

...