我一直在使用asp.net MVC,但我仍然不是很擅长。但是,我开始想知道如何创建可以“插入”或安装到现有ASP.net MVC站点的应用程序,而且复杂度最低。
例如,在ASP.net网页表单中,我开发了一种Blogging应用程序。为了安装这个应用程序,我只需要将一个dll放入Bin文件夹,添加一些web.config行,然后根据需要将控件添加到aspx页面。不需要做出其他改变。
现在我正在使用MVC,我遇到了部分视图,它们似乎以某种方式取代了webform用户控件。但是,您似乎仍需要从控制器传递部分视图的数据,并且该数据的级别高于页面。我必须修改控制器代码才能安装应用程序。
我很确定我用错误的心态思考这个问题。有没有办法为asp.net mvc创建可以轻松插入现有网站的应用程序?
答案 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)