«Обновление» интерфейсов
Пару дней назад я увидел, что CoClassAttribute используется так, как у меня не былоТ воображал раньше.
[ComImport, CoClass(typeof(Foo)), Guid("787C1303-AE31-47a2-8E89-07C7257B1C43")]
interface IFoo {
void Bar();
}
class Foo : IFoo {
public void Bar() {
Console.WriteLine("Oh retado!");
}
}
используется как:
class CoClassDemo {
public static void Show() {
var a = new IFoo();
a.Bar();
}
}
Это не должно было меня удивить, поскольку COM Interop делает именно это с первых дней .NET Framework. Я просто неЯ уделял так много внимания копанию кода COM Interop в .NET Reflector.
method public hidebysig static void Show() cil managed
{
.maxstack 1
.locals init (
[0] class ConsoleApplication1.IFoo a)
L_0000: nop
L_0001: newobj instance void ConsoleApplication1.Foo::.ctor()
L_0006: stloc.0
L_0007: ldloc.0
L_0008: callvirt instance void ConsoleApplication1.IFoo::Bar()
L_000d: nop
L_000e: ret
}
Случилось так, что вне контекста COM Interop я сразу же предположил, что это будет использоваться какбедный человек'Инжекция зависимости от времени компиляции.
Все, что нужно сделать, это избавиться от обычного «я» префикс на интерфейсеимя (как и COM Interop).
Тогда нужно будет изменить атрибут CoClass, чтобы поменять реализацию на другую, посмеяться и т. Д.
Два недостатка, которые я вижу заранее, - это необходимость перекомпиляции (что в значительной степени ограничивает сценарии тестирования временем разработки) и возможные проблемы, связанные с циклическими зависимостями, когда интерфейсы и реализации развертываются в разных сборках.
Кто-нибудь играл с этой техникой? Есть ли другие недостатки? Другое использование?