[Composite UI][OB之BuilderStrategy扩展(一)]CAB之BuilderStrategy概览

简介:

 

********************************************************************
*                                                 版权声明
*
* 本文以Creative Commons的知识共享署名-非商业性使用-相同方式共享发布,请严格遵循该授权协议。
* 本文首发于博客园, 此声明为本文章中不可或缺的一部分。
* 作者网名:    浪子
* 作者EMAILdayichen (at)163.com
* 作者BLOG:  Http://Www.Cnblogs.Com/Walkingboy
*
********************************************************************

[CAB][OB之BuilderStrategy扩展(一)]CAB之BuilderStrategy概览

-Written by 浪子@cnblogs.com  (06-09-21)

摘要:

有看过CAB的人一定非常赞叹于CAB中对Attribute的灵活应用程度,它使得开发者只需要轻轻松松的贴上相关的Atrribute就可以从CAB中获得想要的XX。而如此便捷的开发方法,背后是以IoC/DI思想为指导,依托OB(关于OB的相关知识请参考:http://www.cnblogs.com/walkingboy/category/56479.html)来实现的。本系列文章试图从CAB如何应用OB的角度来深入了解CAB到底是如何产生这种灵活的开发机制的。




CAB到底扩展了哪些BuilderStrategy,并且应用了哪些BuilderStrategy,我们从  
public abstract class CabApplication<TWorkItem>where TWorkItem : WorkItem, new()
中可以看到,CAB到底应用了多少个策略,以及他们是如何协同工作的。

private Builder CreateBuilder()
{
Builder builder = new Builder();

builder.Strategies.AddNew<EventBrokerStrategy>(BuilderStage.Initialization);
builder.Strategies.AddNew<CommandStrategy>(BuilderStage.Initialization);
builder.Strategies.Add(new RootWorkItemInitializationStrategy(this.OnRootWorkItemInitialized), BuilderStage.Initialization);
builder.Strategies.AddNew<ObjectBuiltNotificationStrategy>(BuilderStage.PostInitialization);

builder.Policies.SetDefault<ISingletonPolicy>(new SingletonPolicy(true));
builder.Policies.SetDefault<IBuilderTracePolicy>(new BuilderTraceSourcePolicy(new TraceSource("Microsoft.Practices.ObjectBuilder")));
builder.Policies.SetDefault<ObjectBuiltNotificationPolicy>(new ObjectBuiltNotificationPolicy());

return builder;
}

可见CAB对于PreCreation,Creation并没有进行任何的扩展,关键在于对象创建后的Initialization和PostInitialization阶段。

在Initialization扩展了

  • EventBrokerStrategy:用来处理事件的发布与订阅
  • CommandStrategy:用来处理Command与事件的关联
  • RootWorkItemInitializationStrategy:用来处理RootWorkItem的其他初始化工作

在PostInitialization则扩展了

  • ObjectBuiltNotificationStrategy:对象创建通知服务

虽然有4个扩展策略,但是CAB默认只启用了SingletonPolicy,BuilderTraceSourcePolicy,ObjectBuiltNotificationPolicy。哪是这些策略在哪里启用呢?搜索一下整个源码,发现只有WorkItem里面有设置Policy的地方 

protected internal void BuildUp()
{
// We use Guid.NewGuid() to generate a dummy ID, so that the WorkItem buildup sequence can
// run (the WorkItem is already located with the null ID, which marks it as a service, so
// the SingletonStrategy would short circuit and not do the build-up).
Type type = GetType();
string temporaryID = Guid.NewGuid().ToString();
PropertySetterPolicy propPolicy = new PropertySetterPolicy();
propPolicy.Properties.Add("Parent", new PropertySetterInfo("Parent", new ValueParameter(typeof(WorkItem), null)));
PolicyList policies = new PolicyList();
policies.Set<ISingletonPolicy>(new SingletonPolicy(false), type, temporaryID);
policies.Set<IPropertySetterPolicy>(propPolicy, type, temporaryID);
builder.BuildUp(locator, type, temporaryID, this, policies);
}

是不是有点纳闷?其实我走入了一个误区,在我的OB相关文章中下过这样一个定论:OB的BuilderStrategy如何起作用,都是通过相关的BuilderPolicy 来决定。而CAB中的BuilderStrategy却没有通过BuilderPolicy来约束BuilderStrategy的应用。

那CAB是不是就只有这些BuilderStrategy呢?

这些策略当然不够用的。这些只是核心的BuilderStrategy,或者叫"无关UI的BuilderStrategy"。

相反,CAB中还有些与UI有关的BuilderStrategy,看一下WinForm应用程序的基类CabApplication

public abstract class CabApplication<TWorkItem>where TWorkItem : WorkItem, new()
中的
/// <summary>
/// May be overridden in a derived class to add strategies to the <see cref="Builder"/>.
/// </summary>
protected virtual void AddBuilderStrategies(Builder builder){}
这个方法就是为子类提供新增自定义BuilderStrategy的一种途径。
比如子类WindowsFormsApplication中的
/// <summary>
/// Adds Windows Forms specific strategies to the builder.
/// </summary>
protected override void AddBuilderStrategies(Builder builder)
{
builder.Strategies.AddNew<WinFormServiceStrategy>(BuilderStage.Initialization);
builder.Strategies.AddNew<ControlActivationStrategy>(BuilderStage.Initialization);
builder.Strategies.AddNew<ControlSmartPartStrategy>(BuilderStage.Initialization);
}
可见从CabApplication继承出来的子类,还存在继续扩展OB创建策略的可能性。在WindowsFormsApplication中就扩展了适用于WinForm的三个创建策略。
假设我们新实现了一个WebFormsApplication,很有可能就需要创建跟Web UI比较密切相关的BuilderStrategy。
 
小结:
    可见CAB中的BuilderStrategy可分为两大类:无关UI和UI相关。
    后续我按自己的研读步骤,逐一剖析每一个BuilderStrategy的内部机制以及它在CAB中所起的作用。
 
注:
-------------------------------------------------


本文转自浪子博客园博客,原文链接:http://www.cnblogs.com/walkingboy/archive/2006/09/21/CAB_OB_BuilderStrategy.html,如需转载请自行联系原作者
目录
相关文章
|
6月前
鸿蒙使用 @Builder扩展出来的布局数据更新没法更新UI
鸿蒙使用 @Builder扩展出来的布局数据更新没法更新UI
201 1
|
6月前
鸿蒙使用 @Builder扩展出来的布局数据更新没法更新UI
采用的方法是在修改数据时,通过`this.dArray.splice(index, 1, this.dArray[index])`替换指定元素,强制数组更新并反映到界面上。
256 0
|
前端开发
前端项目实战伍拾肆react-admin+material ui-踩坑-扩展运算符写增删改
前端项目实战伍拾肆react-admin+material ui-踩坑-扩展运算符写增删改
65 0
高级UI系列(四) 扩展TextView 边角Drawable实战篇
高级UI系列(四) 扩展TextView 边角Drawable实战篇
106 0
高级UI系列(四) 扩展TextView 边角Drawable实战篇
|
2月前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。