2009-11-27 90 views
0

是否可以在ASP.NET网站中加载外部“web部件”?我想使包含用户控制或页面的独立dll包含在主站点中。就像网站的插件架构一样。你可以在ASP.NET中有一个插件体系结构吗?

我看起来可以找到的唯一示例将用户控件绑定到主项目,您需要对控件有一个“硬”引用。

我想要的是定义一个插件可以实现的共享接口,并且网站可以加载和显示。

+0

你可以肯定有一个包含一堆用户控件的DLL。而你的用户控件当然可以实现你所选择的界面。不过,你似乎想要的比这更多 - 但我不确定究竟是什么。 – RickNZ 2009-11-27 15:05:57

+0

用户控件似乎无法像插件一样被“按需”加载。您需要在主机网站中包含参考。我希望能够加载任何实现我的界面的.dll,而无需更改主机网站。 – 2009-11-27 15:22:31

回答

3

有一个讨论在这里有关编译UserControl s转换的dll

ASP.NET UserControl class library

对于像你所描述的,我会强烈建议creating custom server controls。您可以为所有插件提供抽象基类。

public abstract class PluginBase : WebControl { 

} 

然后,您可以搜索一个目录中的程序集,并在每个程序集中搜索任何派生自该类型的程序集。

DirectoryInfo di = new DirectoryInfo(path); 
    FileInfo[] assemblies = di.GetFiles("*.dll"); 
    foreach (var assembly in assemblies) { 
     Assembly a = Assembly.LoadFrom(assembly.FullName); 
     foreach (Type type in a.GetTypes()) { 
      if (type.BaseType == typeof(PluginBase)) {      
       //load plugin 
      } 
     } 
    } 

您也可以通过提供配置部分,如例如here

+0

这似乎是一个不错的解决方案。您是否必须完全使用代码构建WebControl,还是有可能使用模板引擎? – 2009-11-27 15:06:02

1

插件可以实现你的界面注册您的插件在你的web.config。接口可以定义一种方法。此方法为插件的上下文提供必要的常规输入。插件的责任是返回可以放在最终输出页面上的html标记。通过这种方式,你可以扩大这个范围,但是会危害页面生命周期和回发功能,因为页面不知道插件返回的内容。

+0

如果接口像Bob建议的那样实现WebControl,我是否也会失去回发功能? – 2009-11-27 15:07:54

+1

是的,您将失去回发功能。给你一个想法UserControls是由asp.net提供的内置插件机制。 UserControl派生自System.Web.UI.Page,使其具有回发功能。我建议您不要重新设计轮子,而应该尝试通过制作自己的UserControl基类来使插件开发人员可以使用它来专门化UserControl。它可以是非常特殊的,它可能会公开与您的应用程序体系结构和核心业务逻辑耦合的方法和道具。 – 2009-11-28 12:05:56

1

我想你想有一个基础设施,能够加载分离模块(控制反转,或IOC)

阅读更多关于WCSF 的Web客户端软件工厂 www.codeplex.com/websf

,如果你想了解与模块化方法设计的Web应用程序很好的示例代码,请下载Cuyahoga

凯霍加是一个开源.NET web 网站框架。它提供内容 管理功能,并具有 模块化方法

毕竟读了ASP.NET 3.5社交网络 很不错的书。

创建使用 ASP.NET 3.5 以实用,动手的方式学习重点新ASP.NET主题的完整功能,企业级社交网络:LINQ,AJAX, 3·C。0,n层架构和MVC 建立朋友列表,消息系统,用户配置文件,博客,留言 板基,更 丰富的示例代码,清晰的解释,有趣的例子, 和实用的建议 - 一个真正 动手预订的ASP.NET开发人员

www.packtpub.com/expert-guide-for-social-networking-with-asp-.net-3.5/book

的作者向我们展示了如何将设计模式应用于现实世界的网络应用纳秒。 所有以黑体突出的模块与IOC模式与使用StructureMap

这本书也有很不错的示例代码,您可以由Packt出版社网站上下载的开发。