«Обновление» интерфейсов

Пару дней назад я увидел, что 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, чтобы поменять реализацию на другую, посмеяться и т. Д.

Два недостатка, которые я вижу заранее, - это необходимость перекомпиляции (что в значительной степени ограничивает сценарии тестирования временем разработки) и возможные проблемы, связанные с циклическими зависимостями, когда интерфейсы и реализации развертываются в разных сборках.

Кто-нибудь играл с этой техникой? Есть ли другие недостатки? Другое использование?

Ответы на вопрос(1)

Ваш ответ на вопрос