1

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

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

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

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

4

2 回答 2

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 你有你的插件!

于 2009-05-18T21:05:11.003 回答