NBear IOC 重构笔记

按 NBearV3 中文用户手册的做法, 历经坎坷。 愿本文给相似经历的朋友一些帮助。

1。整理好所需要的 Dll 和 MQService (Hosting 的调度中心),Hosting 程序。这个结构很好。 Hosting 可分布,但是对于客户端程序来说,只认得 MQService 。
    Dll版本的不一致会造成许多莫名其妙的问题。
    Hosting 可能起动不了。说 类实现没有实现接口。
    客户端可能报,Dll 不一致。

用 sn -T webpart.dll (注意 -T  须是大写) , 可查看 Dll 的 公钥 。

2。MQService 和 Hosting , 例子程序是正确的。贴一下配置文件吧。
MQService.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  
<configSections>
    
<section name="serviceFactory" type="NBear.IoC.Service.Configuration.ServiceFactoryConfigurationSection, NBear.IoC" />
  
</configSections>
  
<serviceFactory type="Remoting" name="testServiceFactory" protocol="TCP" server="192.168.1.97" port="8888" debug="true" maxTry="30" />
</configuration>


Hosting.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    
<configSections>
        
<section name="serviceFactory" type="NBear.IoC.Service.Configuration.ServiceFactoryConfigurationSection, NBear.IoC" />
        
<section name="castle"   type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor" />

    
</configSections>
    
<castle>
        
<components>
            
<!--You can use standard castle component decleration schema to define service interface impls here-->
            
<component id="categoryservice" service="Bus.Ent.IDictProc,Bus" type="Bus.Ent.DictProc,BusImp"/>
        
</components>
    
</castle>
    
<serviceFactory type="Remoting" name="testServiceFactory" protocol="TCP" server="192.168.1.97" port="8888" debug="true" maxTry="30" />
</configuration>


3。 Console客户端和Web客户端的调用方式,配置方式,是一样的, 但例子给出的, 怎么调也不对。应该像下面一样:

<?xml version="1.0"?>
<configuration>
    
<configSections>
        
<section name="serviceFactory" type="NBear.IoC.Service.Configuration.ServiceFactoryConfigurationSection, NBear.IoC" />
        
<section name="entityConfig" type="NBear.Common.EntityConfigurationSection, NBear.Common"/>
        
<section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor"/>
    
</configSections>
    
<entityConfig>
        
<includes>
            
<add key="Sample Entity Config" value="~/EntCfg.xml"/>
        
</includes>
    
</entityConfig>
    
<castle>
        
<components>
            
<!--You can use standard castle component decleration schema to define service interface impls here-->
            
<component id="categoryservice" service="Bus.Ent.IDictProc,BusIfc" type=""/>
        
</components>
    
</castle>
    
<serviceFactory type="Remoting" name="testServiceFactory" protocol="TCP" server="192.168.1.97" port="8888" debug="true" maxTry="30" />
    
<appSettings/>
    
<connectionStrings>
        
<!--<add name="Northwind" connectionString="Server=(local);Database=Northwind;Uid=sa;Pwd=sa" providerName="NBear.Data.SqlServer.SqlDbProvider"/>-->
    
</connectionStrings>
    
</configuration>

component 节中, 不要写 type , 如果写了实现的 Type ,它就不会远程调用了。 想想也是, 客户端只留一个接口就OK了。不必要留实现。

4。接口要继承自 NBear.IoC.Service.IServiceInterface  , 而不是 IService 。这一点例子也写错了。
5。其它的很简单,照例子做就没有问题。如果出现问题,多检查环境。

 

再说说, 什么是 IOC 。

IOC 是 Inversion of Control , 控制反转, 直接理解,不太形象,这里有著名的好莱坞理论:如果你想做什么事,你告诉我,但是你呆着别动,到时我会找你。后被Martin Fowler改名为 Dependency Injection 依赖注射,也就是将类之间的关系通过第三方进行注射,不需要类自己去解决调用关系。

它是一种实现将类解耦的方式,也算是一种设计原则 ,形成了一个设计模式(DI依赖倒置),也是分布式设计的具体应用。

在分布式中这样说,客户端说,我要创建 A 对象, 调用 A.B 方法 。但是 , 客户端只有 A 接口 和 A.B 空方法 。 具体实现会在服务器端来做。 这就是 IOC 。 实现了调用与实现的分离。

 

在百科上看到了 IOC 的定义,让人感觉更明白,更容易理解:

IoC  (Inversion of Control)

  中文译为控制反转  又称为“依赖注入”(DI =Dependence Injection)

  IOC的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器负责将这些联系在一起。

  其原理是基于OO设计原则的The Hollywood Principle:Don't call us, we'll call you(别找我,我会来找你的)。也就是说,所有的组件都是被动的(Passive),所有的组件初始化和调用都由容器负责。组件处在一个容器当中,由容器负责管理。

  简单的来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。

最后一句,结合代码,点睛之笔。

posted @ 2009-01-03 04:09  NewSea  阅读(496)  评论(0编辑  收藏  举报