Использует ли MEF (Managed Extensibility Framework) типизацию "утка"? - PullRequest
6 голосов
/ 17 июля 2009

У меня есть 2 сборки:

Сборка 1:

interface IWeapon {
    int Might { get; }
}

[Export("sword")]
public class Sword : IWeapon {

    public int Might {
        get { return 10; }
    }
}

Сборка 2:

interface IWeapon {
    int Might { get; }
}

var catalog = new AssemblyCatalog(typeof(Ninja.Sword).Assembly);
var container = new CompositionContainer(catalog);
// not allowed to use the IWeapon def in assembly 2 
var sword = container.GetExportedValue<IWeapon>("sword");

Я знаю, как заставить это работать. Я могу либо запросить MEF (Managed Extensibility Framework) для объекта, либо заставить его экспортировать правильный IWeapon, а не просто объект по имени.

Может ли MEF выполнить для меня печать "утка" и вернуть прокси-объект, если все точки интерфейса реализованы?

Ответы [ 2 ]

5 голосов
/ 17 июля 2009

Я думаю, что это было в ранних версиях MEF (путем динамического создания IL для класса и его возврата), и теперь оно удалено. Это действительно не имеет смысла. В конце концов, ваш класс должен быть предназначен для реализации этой функциональности надстройки через определенный интерфейс. Если вы можете добавить к ним такие вещи, как атрибут Export, вы также сможете прекрасно реализовать интерфейс в своем классе.

1 голос
/ 15 апреля 2012

Если оба ваших класса IWeapon имеют один и тот же COM Guid, вы можете приблизиться к типу утки, используя эквивалентность типов в .NET 4. Это очень удобно для поддержки версий и обновления плагинов с MEF, т. Е. Имея контракт v2, который также загрузить плагины, которые реализуют только v1 контракта. Вот хорошая статья на эту тему.

http://blogs.msdn.com/b/delay/archive/2011/03/09/mef-addict-combining-net-4-s-type-embedding-and-mef-to-enable-a-smooth-upgrade-story-for-applications-and-their-extensions.aspx

...