技术开发 频道

.NET 时代里的AOP


发送CodeDom

    我们将需要把一个自定义串化器与Base控制器连接起来,为了定制持续性,以及发送代码来保存视图 映射以及我们需要的任何潜在代码。
[DesignerSerializer(typeof(ControllerCodeDomSerializer),
typeof(CodeDomSerializer))]
public class BaseController : Component, IExtenderProvider
    自定义串化器必须从CodeDomSerializer继承而来。这个基本抽象类型(此基本抽象类型位System.ComponentModel.Design序列化)包含必须实现的两个抽象方法。
public abstract class CodeDomSerializer 
{
public abstract object Serialize(
IDesignerSerializationManager manager, object value);
public abstract object Deserialize(
IDesignerSerializationManager manager, object codeObject);
}
    无论什么时候,对象需要被保存时,Serialize方法都会被调用。返回值必须是类型CodeStatementCollection(此类型包括代码来保存)的一个对象。同样的,Deserialize方法中的codeObject参数包括前面被发送的语句。

    在概述中,我们就谈到示例根组件,通过根设计器来设计它。在根组件世界中,几乎所有构件(以及控件)中都会发生这一过程。真正发生的却是集成开发环境 执行InitializeComponent中的大部分代码,重新创建对象,就像它们处在运行库里一样。我们说大部分而不是所有是因为仅仅修改问题中的构件的语句才被调用:例如:它们中的属性设置以及方法调用.通过定制Deserialize方法,我们有机会在设计时期重建过程中互相作用。通常这是没必要的,因此大部分时间我们就把球传到初始构件串化器ComponentCodeDomSerializer,此ComponentCodeDomSerializer基本上实现此代码。为了得到类型的串化器,我们使用我们接受到的IDesignerSerializationManager参数的GetSerializer方法。此对象有其它有用的方法,我们将在后面使用它们。

    因此Deserialize实现通常是这样的:
public override object Deserialize( 
IDesignerSerializationManager manager, object codeObject)
{
CodeDomSerializer serializer =
manager.GetSerializer(typeof(Component), typeof(CodeDomSerializer));
return serializer.Deserialize(manager, codeObject);
}

    重新找回构件初始串化器是管理器的普通使用。因为反序列化通常是一样的。我们将把它放在基本类型,并且将从控制器串化器生成基本类型。

internal abstract class BaseCodeDomSerializer : CodeDomSerializer
{
protected CodeDomSerializer GetBaseComponentSerializer(
IDesignerSerializationManager manager)
{
return (CodeDomSerializer)
manager.GetSerializer(typeof(Component), typeof(CodeDomSerializer));
}

public override object Deserialize(
IDesignerSerializationManager manager, object codeObject)
{
return GetBaseComponentSerializer(manager).Deserialize(manager,
codeObject);
}
}
   后面将为这个类型补充其它的公共方法。现在需要进行串行化过程,我们需要通过Hashtable的所有DictionaryEntry元素来迭代,发送下面的代码,为了保存ConfiguredViews属性。

controller.ConfiguredViews.Add("txtID", 
new ViewInfo("txtID", "Text", "Publisher", "ID"));
   另一个公共的方法就是让初始构件串化器执行它自己的工作。然后补充我们的自定义语句。通过这种方法,我们避免了自己保存公共构件属性。因此串化器开始执行这些任务:
internal class ControllerCodeDomSerializer : BaseCodeDomSerializer 
{
public override object
Serialize(IDesignerSerializationManager manager, object value)
{
CodeDomSerializer serial = GetBaseComponentSerializer(manager);
if (serial == null)
return null;
CodeStatementCollection statements = (CodeStatementCollection)
serial.Serialize(manager, value);
0
相关文章