深入观察 .NET组件模型及继承
此层次结构是通过这种方式建立的,因为PublisherControler中被拉曳的模式传递“错误”容器。结果就是:设置在BaseControler类型中的任何代码将不能访问被包含的构件。解决方案就是把模式构造函数传递到基本类型components领域。然而,这样要使此领域能被继承者访问,继承者在某种程度上违背了封装的OO法则。一个更好的解决方案就是在基本类型内实现IContainer,将this引用传递到模式构造函数。基本类型内的接口实现将提供访问components领域的正确途径。
public class BaseController : Component, IContainer, IExtenderProvider我们能安全删除包括容器的基本类型构造函数,因为继承类型(例如:PublisherController)将它们自己补充到基本类型构造函数,这是默认行为,与继承不相冲突。
{
#region Implementation of IContainer
/// <summary>
/// Always initialize the container because we will host components
/// from inheriting controllers.
/// </summary>
private Container components = new Container();
public void Remove(IComponent component)
{
components.Remove(component);
}
public void Add(IComponent component, string name)
{
components.Add(component, name);
}
public void Add(IComponent component)
{
components.Add(component);
}
public ComponentCollection Components
{
get
{
return components.Components;
}
}
#endregion
...
public PublisherController(IContainer container)基本类型不需要InitializeComponent或者特殊构造函数代码,因为在领域宣告中,components领域初始化了它自己。
{
container.Add(this);
InitializeComponent();
}
现在,为模式构造函数定制代码,因此要使用下面的代码:
this.model = new Mvc.Components.Model.PublisherModel(this);而不是这个代码
this.model = new Mvc.Components.Model.PublisherModel(this.components);我们必须附加一个自定义CodeDomSerializer,就像为基本控制器所作的一样:
[DesignerSerializer(typeof(ModelCodeDomSerializer),与控制器代码相比较,串行器代码非常简单:
typeof(CodeDomSerializer))]
public class BaseModel : Component
internal class ModelCodeDomSerializer : BaseCodeDomSerializer
{
public override object Serialize(
IDesignerSerializationManager manager, object value)
{
CodeDomSerializer serializer = GetBaseComponentSerializer(manager);
if (serializer == null)
return null;
CodeStatementCollection statements = (CodeStatementCollection)
serializer.Serialize(manager, value);
0
相关文章