У меня есть сборка, которая содержит 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
. И даже если их не будет, сигнатура метода не совпадает.
Как я могу это сделать?