技术开发 频道

.NET 时代里的AOP


   可以扩展这个属性,并且在属性浏览器里直接配置此属性。属性名称下面被显示的自定义字符串表示法是一个简单的覆盖类型ToString方法的方法。

public override string ToString() 
{
if (_controlproperty == String.Empty &&
_model == String.Empty && _modelproperty == String.Empty)
return "No mapping configured.";
else
return _model + "." + _modelproperty + " -> " +
_controlid + "." + _controlproperty;
}
   为了访问当前控件的属性可以使用下面的代码。

public ViewInfo GetWebViewMapping(object target) 
{
return ConfiguredViews[((System.Web.UI.Control)target).ID] as ViewInfo;
}

public void SetWebViewMapping(object target, ViewInfo value)
{
ConfiguredViews[((System.Web.UI.Control)target).ID] = value;
}
   Configured Views是类型Hashtable的一个属性,此类型Hashtable能保存映射。注意被扩展的属性仅仅像集成开发环境的另一个成员,也像代码中的可持续性。因此现在集成开发环境不知道怎样保存控件中新的Web Views Mapping属性,它也不知道怎样保存构件自己的Configured Views属性。在下一章中将讨论怎样发送自定义代码来保存这些值。为了通知VS.NET,它应该忽视持续性(被称为序列化)过程中的这些属性:

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
   这个属性仅仅应用到GetXX方法,此GetXX方法是对属性负责的方法。
   过去具体使用的ProvideProperty属性声明扩展web控件:
[ProvideProperty("ViewMapping", typeof(System.Web.UI.Control))] 
[ProvideProperty("ViewMapping", typeof(System.Windows.Forms.Control))]
public class BaseController : Component, IExtenderProvider
   实际上这一点是行不通的。即使让第一个扩展器使用“wins”.也就是说,如果打开一个附带有控制器的Windows窗体,并且定义一些映射,Web窗体控件将不再为整个VS.NET过程查看被扩展的属性。为了再一次得到Web窗体中的被扩展的属性,我们必须关闭并且重新打开VS.NET。但是,如果Web 窗体“wins”, Windows窗体就失败了。因此为每一个实现Get/Set。

[ProvideProperty("WinViewMapping", typeof(System.Windows.Forms.Control))] 
[ProvideProperty("WebViewMapping", typeof(System.Web.UI.Control))]
public class BaseController : Component, IExtenderProvider
   所有效地完成的就是为现有的控件增加功能,但是实际上并没有接触它们。我们需要一个方法来保存这些被配置的值,因为现在关闭窗体时,就失去了所有的值。
0
相关文章