SQLCenter和IoC模式

本文探讨了SQLCenter中使用IoC容器实现组件解耦的方法,通过配置文件定义组件关系,并利用.NET框架Spring.Net实现了组件的热插拔及管理。
在学习SQLCenter的时候,对老大说的Generators设计中用到了默认代理模式和Ioc模式有点问题。刚才晚上又重新看了下,哈哈,有点醍醐灌顶的感觉。确实如此。下面写写自己的体会。
默认代理模式就不多说了。主要看Ioc的体现,因为最近我正在学习Spring.Net,所以对Ioc,AOP这样的字眼特别敏感。
关于Ioc,园子里面有太多的好文章。我简单描述我的感觉,同时联系下SQLCenter.
Ioc的出现,是为了解耦。使类或组件尽可能的“不和陌生人说话”。但是他们又必须有这样的联系,怎么办呢?这就出现了Ioc容器。通过这样的容器来管理这些组件之间的联系。这样的容器在.Net下有Spring.Net,Castle,java下还有PicoContainer,Hiemind,XWork等。在Ioc中这些framework成了主程序的角色,负责协调事件和应用的活动,还有生命周期等。
在SqlCenter中GeneratorService在一定程度上扮演了这样一个角色。它通过配置文件获得组件之间的关系,负责创建和调度。当然目前还没有全部完成这样一个容器的功能,但是思想上已经充分体现了Ioc模式。

看下部分配置:

ContractedBlock.gifExpandedBlockStart.gif配置信息
1None.gif <generators>
2None.gif      <item target="SqlCenter.Entities.Field, SqlCenter.Entities" type="default" generator="SqlCenter.Generators.FieldGenerator, SqlCenter.Generators"/>
3None.gif      <item target="SqlCenter.Entities.Order, SqlCenter.Entities" type="default" generator="SqlCenter.Generators.OrderGenerator, SqlCenter.Generators"/>
4None.gif      <item target="SqlCenter.Entities.Join, SqlCenter.Entities" type="default" generator="SqlCenter.Generators.JoinGenerator, SqlCenter.Generators"/>
5None.gif      <item target="SqlCenter.Entities.FromTable, SqlCenter.Entities" type="default" generator="SqlCenter.Generators.FromTableGenerator, SqlCenter.Generators"/>
6None.gifdot.gifdot.gif
7None.gif</generators>

然后主要通过这个NativeGetCalculator方法实现了容器的基本功能:

ContractedBlock.gifExpandedBlockStart.gif简单容器
 1None.gifprivate static object NativeGetCalculator(NameObjectCollection cache,CalculatorConfigurationCollection configurations,Type expressionType, string dbType)
 2None.gif        {
 3None.gif            dbType=dbType.ToLower().Trim();
 4None.gif            Hashtable item=cache[dbType] as Hashtable;
 5None.gif            if (item==null)
 6None.gif            {
 7None.gif                lock(cache)
 8None.gif                {
 9None.gif                    item=new Hashtable();
10None.gif                    cache.Add(dbType,item);
11None.gif                }
12None.gif            }
13None.gif            object calculator=item[expressionType];
14None.gif            if(calculator==null)
15None.gif            {
16None.gif                CalculatorConfiguration config=configurations.FromTarget(expressionType,dbType);
17None.gif                if(config!=null)
18None.gif                {
19None.gif                    lock(item)
20None.gif                    {
21None.gif                        if(calculator!=null)
22None.gif                        {
23None.gif                            calculator=Activator.CreateInstance(config.Calculator, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, null, new object[] {}, null);
24None.gif                            item.Add(expressionType,calculator);
25None.gif                        }
26None.gif                    }
27None.gif                }
28None.gif                else if(string.Compare(dbType,"default",true)!=0)
29None.gif                {
30None.gif                    config=configurations.FromTarget(expressionType,"default");
31None.gif                    if(config!=null)
32None.gif                    {
33None.gif                        lock(item)
34None.gif                        {
35None.gif                            if(calculator==null)
36None.gif                            {
37None.gif                                calculator=Activator.CreateInstance(config.Calculator, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, null, new object[] {}, null);
38None.gif                                if(calculator is IGenerator)
39None.gif                                {
40None.gif                                    ((IGenerator)calculator).Type=dbType;
41None.gif                                }
42None.gif                                item.Add(expressionType,calculator);
43None.gif                            }
44None.gif                        }
45None.gif                    }
46None.gif                }
47None.gif            }
48None.gif            return calculator;
49None.gif        }
50None.gif

通过这样的实现,就能够实现组件的“热插拔”和组件关系的容器管理。
今天终于调试通过了自己的基于Spring.Net的一个简单demo.再回头看看SQLCenter,我对自己说:这就是Ioc精神!
对了,还有一个需要注意的。当然这个注意点很小,也许是因为我对配置写程序的不熟悉。调试自己demo的时候,总是有问题。最后在老大的指导下,才发现原来是对这个配置的错误理解:

<item target="SqlCenter.Entities.FromTable, SqlCenter.Entities" type="default" generator="SqlCenter.Generators.FromTableGenerator, SqlCenter.Generators"/>

这里面的generator怎么写?  ====>     NameSpace.ClassName, Assembly

转载于:https://www.cnblogs.com/flyingchen/archive/2006/10/18/532951.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值