Asp.net mvc 创造;可插拔;asp.net mvc中的应用程序

Asp.net mvc 创造;可插拔;asp.net mvc中的应用程序,asp.net-mvc,web-applications,servercontrols,Asp.net Mvc,Web Applications,Servercontrols,我一直在使用asp.NETMVC,但还不是很擅长。但是,我开始想知道如何创建可以“插入”或安装到现有ASP.net MVC站点中的应用程序,并且复杂性最低 例如,在ASP.NETWeb表单中,我开发了一种博客应用程序。为了安装这个应用程序,我只需要将一个dll放到Bin文件夹中,添加一些web.config行,然后根据需要向aspx页面添加控件。无需进行其他更改 现在我正在使用MVC,我遇到了部分视图,它们似乎以某种方式取代了webform用户控件。但是,您似乎仍然需要从控制器传递部分视图的数据

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

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

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


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

我做了很多类似的工作,从这里开始,我获得了几乎所有需要的信息:

我使用插件的最大项目是一个音频处理应用程序

总的想法是:

您可以在一个单独的、可分发的、已签名的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);
}
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();
    }
私有void加载插件(字符串applicationPath)
{
如果(!Directory.Exists(applicationPath))
抛出新ArgumentException(“未找到传递给LoadPlugins的路径。”,“applicationPath”);
List factoriesList=新列表();
列表阅读器列表=新列表();
foreach(Directory.GetFiles(applicationPath,*.plugin)中的字符串assemblyFilename)
{
Assembly moduleAssembly=Assembly.LoadFile(Path.GetFullPath(assemblyFilename));
foreach(moduleAssembly.GetTypes()中的类型)
{
IPluginFactory实例=null;
if(type.GetInterface(“IPluginFactory”)!=null)
instance=(IPluginFactory)Activator.CreateInstance(类型);
if(实例!=null)
{
factoriesList.Add(实例);
开关(instance.PluginType)
{
案例插件类型。读卡器:
Add((IReader)instance.Create());
打破
}
}
}
}
this.readers=readersList.AsReadOnly();
}

你有你的插件

我已经做了很多类似的工作,我从这里获得了我需要的几乎所有信息:

我使用插件的最大项目是一个音频处理应用程序

总的想法是:

您可以在一个单独的、可分发的、已签名的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);
}
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();
    }
私有void加载插件(字符串applicationPath)
{
如果(!Directory.Exists(applicationPath))
抛出新ArgumentException(“未找到传递给LoadPlugins的路径。”,“applicationPath”);
List factoriesList=新列表();
列表阅读器列表=新列表();
foreach(Directory.GetFiles(applicationPath,*.plugin)中的字符串assemblyFilename)
{
Assembly moduleAssembly=Assembly.LoadFile(Path.GetFullPath(assemblyFilename));
foreach(moduleAssembly.GetTypes()中的类型)
{
IPluginFactory实例=null;
if(type.GetInterface(“IPluginFactory”)!=null)
instance=(IPluginFactory)Activator.CreateInstance(类型);
if(实例!=null)
{
factoriesList.Add(实例);
开关(instance.PluginType)
{
案例插件类型。读卡器:
Add((IReader)instance.Create());
打破
}
}
}
}
this.readers=readersList.AsReadOnly();
}
你有你的插件

另请参见:


另请参见: