2009-05-18 10 views
1

私はasp.net MVCで作業していますが、まだそれほど良くはありません。しかし、複雑さを最小限に抑えて既存のASP.net MVCサイトにプラグインまたはインストールできるアプリケーションを作成するにはどうすればよいだろうかと思い始めました。asp.net mvcでプラグイン可能なアプリケーションを作成

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

私はMVCで作業していますが、何らかの形でwebform usercontrolsを置き換える部分的なビューを見つけました。しかし、コントローラから部分ビューのデータを引き渡す必要があり、ページよりも上位にあるようです。私はアプリをインストールするためにコントローラコードを変更する必要があります。

私は間違った考え方でこれについて考えていると確信しています。既存のWebサイトに簡単に接続できるasp.net mvc用のアプリケーションを作成する方法はありますか?

答えて

3

私はこのような仕事のかなり多くを行っていると私は、ほぼすべての私はここからスタートするneeed情報のを得た:プラグインを使用して

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にプラグインがあります!

関連する問題