Создание подключаемых приложений в asp.net mvc - PullRequest
1 голос
/ 19 мая 2009

Я работал с asp.net MVC и до сих пор не очень хорош в этом. Тем не менее, я начал задумываться о том, как мне начать создавать приложения, которые можно «подключить» или установить на существующий сайт ASP.net MVC с минимальной сложностью.

Например, в веб-формах ASP.net я разработал своего рода приложение для блогов. Чтобы установить это приложение, мне просто нужно добавить DLL в папку Bin, добавить несколько строк web.config и затем добавить элементы управления на страницы aspx по мере необходимости. Никаких других изменений не требуется.

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

Я почти уверен, что думаю об этом с неправильным мышлением. Есть ли способ создать приложения для asp.net mvc, которые можно легко подключить к существующему веб-сайту?

Ответы [ 2 ]

3 голосов
/ 19 мая 2009

Я проделал довольно много подобной работы, и я получил почти всю информацию, которая мне нужна, чтобы начать отсюда:

http://www.codeproject.com/KB/cs/pluginsincsharp.aspx

Моим самым крупным проектом с использованием плагинов было приложение для обработки аудио.

Общая идея:

Вы создаете интерфейс для каждого из необходимых вам типов плагинов в отдельной распространяемой подписанной DLL. Вот пример интерфейса:

/// <summary>
/// Describes an audio reader.
/// </summary>
public interface IReader : IPlugin
{
    /// <summary>
    /// Fired by the reader to update the UI on long operations.
    /// </summary>
    event EventHandler<ProgressChangedEventArgs> ProgressChanged;

    /// <summary>
    /// Gets a list of of MIME types the reader supports.
    /// </summary>
    ReadOnlyCollection<string> TypesSupported { get; }

    /// <summary>
    /// Loads a SampleSet from the given input stream.
    /// </summary>
    /// <param name="inStream">The stream to read the</param>
    /// <returns>A SampleSet read from the stream.</returns>
    SampleSet Load(Stream inStream);
}

Затем в вашем плагине dll вы реализуете класс с интерфейсом:

public sealed class WavReader : IReader
{
    ...
}

Затем вы загружаете DLL, используя отражение:

    private void LoadPlugins(string applicationPath)
    {
        if (!Directory.Exists(applicationPath))
            throw new ArgumentException("The path passed to LoadPlugins was not found.", "applicationPath");

        List<IPluginFactory> factoriesList = new List<IPluginFactory>();
        List<IReader> readersList = new List<IReader>();

        foreach (string assemblyFilename in Directory.GetFiles(applicationPath, "*.plugin"))
        {
            Assembly moduleAssembly = Assembly.LoadFile(Path.GetFullPath(assemblyFilename));

            foreach (Type type in moduleAssembly.GetTypes())
            {
                IPluginFactory instance = null;
                if (type.GetInterface("IPluginFactory") != null)
                    instance = (IPluginFactory)Activator.CreateInstance(type);
                if (instance != null)
                {
                    factoriesList.Add(instance);
                    switch (instance.PluginType)
                    {
                        case PluginType.Reader:
                            readersList.Add((IReader)instance.Create());
                            break;
                    }
                }
            }
        }

        this.readers = readersList.AsReadOnly();
    }

И БАМ, у тебя есть свои плагины!

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