Контекст при загрузке сборок через Structuremap - PullRequest
0 голосов
/ 16 июня 2010

Я хочу загрузить плагины аналогично , показанному здесь , однако загруженные сборки, похоже, не имеют общего контекста.

Пытаясь решить проблему, я просто строю крошечный шипсодержащий две сборки.Одно консольное приложение и одна библиотека.Консольное приложение содержит интерфейс IPlugin и не имеет ссылок на dll плагина.

Я сканирую dir плагина, используя пользовательское соглашение о регистрации:

ObjectFactory.Initialize(x => x.Scan(s =>
    {
        s.AssembliesFromPath(@"..\Plugin");
        s.With(new PluginScanner());
    }));

public void Process(Type type, Registry registry)
{
    if (!type.Name.StartsWith("P")) return;

    var instance = ObjectFactory.GetInstance(type);
    registry.For<IPlugin>().Add((IPlugin)instance);
}

, которое выдает недопустимое исключение приведения, говоря"не могу преобразовать тип плагина в IPlugin".

public class P1 : IPlugin
{
    public void Start() { Console.WriteLine("Hello from P1"); }
}

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

Экспериментируя с MEF, Structuremap и загрузкой сборки вручную, где Assembly.Load ("Плагин") показывает, загружен ли с Assembly.Load, это работаетхорошо.Любые идеи, как я могу это исправить, чтобы работать со сканированием сборки StructureMaps?

1 Ответ

0 голосов
/ 27 августа 2010

Я нашел решение.

Возьмите эту структуру:

\Plugins
        \Plugin.dll
        \core.dll
\app.exe
\core.dll

Итак, IPlugin определен в core.dll. Мой плагин имеет зависимость от ядра, а также мое приложение. Мое приложение загружает core.dll и загружает plugin.dll, который будет искать его зависимость в папке плагинов. Загрузка core.dll во второй раз.

Если я получаю тип из Plugin.dll и пытаюсь привести его к IPlugin в ядре, приложение пытается преобразовать объект, который является подклассом {PluginDir} Core.IPlugin, в {AppDir} Core.IPlugin. Это не удастся, потому что интерфейсы разные.

\Plugin.dll
\app.exe
\core.dll    

Этот сценарий будет работать нормально, поскольку и app.exe, и plugin.dll будут использовать один и тот же файл core.dll.

...