1

私はasp.net MVCを使用してきましたが、まだあまり得意ではありません。しかし、最小限の複雑さで既存の ASP.net MVC サイトに「プラグイン」またはインストールできるアプリケーションをどのように作成すればよいのか疑問に思い始めました。

たとえば、ASP.net Web フォームでは、一種のブログ アプリを開発しました。このアプリをインストールするには、DLL を Bin フォルダーにドロップし、いくつかの web.config 行を追加してから、必要に応じて aspx ページにコントロールを追加するだけです。その他の変更は必要ありません。

現在、私は MVC を使用しており、何らかの方法で Web フォームのユーザー コントロールを置き換えているように見える部分的なビューに遭遇しました。ただし、コントローラーから部分ビューのデータを渡す必要があり、それはページよりも高いレベルにあるようです。アプリをインストールするには、コントローラーのコードを変更する必要があります。

私は間違った考え方でこれについて考えていると確信しています。既存の Web サイトに簡単にプラグインできる 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 に答える