在asp.net mvc中创建“可插拔”应用程序

时间:2009-05-18 21:03:20

标签: asp.net-mvc web-applications servercontrols

我一直在使用asp.net MVC,但我仍然不是很擅长。但是,我开始想知道如何创建可以“插入”或安装到现有ASP.net MVC站点的应用程序,而且复杂度最低。

例如,在ASP.net网页表单中,我开发了一种Blogging应用程序。为了安装这个应用程序,我只需要将一个dll放入Bin文件夹,添加一些web.config行,然后根据需要将控件添加到aspx页面。不需要做出其他改变。

现在我正在使用MVC,我遇到了部分视图,它们似乎以某种方式取代了webform用户控件。但是,您似乎仍需要从控制器传递部分视图的数据,并且该数据的级别高于页面。我必须修改控制器代码才能安装应用程序。

我很确定我用错误的心态思考这个问题。有没有办法为asp.net mvc创建可以轻松插入现有网站的应用程序?

2 个答案:

答案 0 :(得分:3)

我做了很多像这样的工作,我从这里得到了几乎所有我需要的信息:

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();
    }

BAM你有插件!

答案 1 :(得分:3)