MVC 3 Plugin сборки, как его использовать при загрузке? - PullRequest
0 голосов
/ 25 января 2012

Я работаю над плагином-интерфейсом для виджетов в приложении MVC 3.Виджеты должны содержать там свои модели, представления и контроллеры.Затем я хочу иметь возможность просто вставить dll (mvc-project "Widget") в папку плагина в моем главном приложении.
Но как мне обратиться к нему, когда он загружается динамически?Я не могу сделать как myapp.plugin.clock, то я получаю ошибку компиляции, сборка загружается в Rumtime !?я должен использовать динамический?

Это код, который я использую для загрузки плагинов, и он, кажется, работает.Теперь я не знаю, как правильно использовать загруженную сборку, есть идеи?

[assembly: PreApplicationStartMethod(typeof(MyApp.PluginActivator), "Initialize")]

public class PluginActivator
{
    private static readonly DirectoryInfo PluginFolderInfo;

    static PluginActivator()
    {
        PluginFolderInfo = new DirectoryInfo(HostingEnvironment.MapPath("~/plugins"));
    }

    public static void Initialize()
    {
        CopyPluginDlls(PluginFolderInfo, AppDomain.CurrentDomain.DynamicDirectory);
        LoadPluginAssemblies(AppDomain.CurrentDomain.DynamicDirectory);
    }

    private static void CopyPluginDlls(DirectoryInfo sourceFolder, string destinationFolder)
    {
        foreach (var plug in sourceFolder.GetFiles("*.dll", SearchOption.AllDirectories))
        {
            if (!File.Exists(Path.Combine(destinationFolder, plug.Name)))
            {
                File.Copy(plug.FullName, Path.Combine(destinationFolder, plug.Name), false);
            }
        }
    }

    public  static void LoadPluginAssemblies(string dynamicDirectory)
    {
        foreach (var plug in Directory.GetFiles(dynamicDirectory, "*.dll", SearchOption.AllDirectories))
        {
            Assembly assembly = Assembly.Load(AssemblyName.GetAssemblyName(plug));
            BuildManager.AddReferencedAssembly(assembly);
        }
    }
}

Ответы [ 2 ]

1 голос
/ 05 марта 2012

Вы на правильном пути.Так как вам удалось загрузить сборки из папки "~ / plugins".Следующая задача - реализовать пользовательский VirtualPathProvider и зарегистрировать все виртуальные пути.Мне удалось реализовать плагинную архитектуру ASP.NET MVC3 Razor с помощью этого поста: http://www.chrisvandesteeg.nl/2010/11/22/embedding-pre-compiled-razor-views-in-your-dll/. Вы можете взять его для справки и реализовать свой собственный фреймворк.Надеюсь, это поможет.

0 голосов
/ 15 августа 2012

Самый простой способ - определить некоторые точки расширения, используя интерфейсы в сочетании с инверсией контейнера управления.

Я описал подход здесь: http://www.codeproject.com/Articles/386674/ASP-NET-MVC-3-plug-in-architecture-using-Griffin-M

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...