JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » .Net Framework » .NET Open Source: Nhibernate, Castle  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 Windsor中IOC的簡單應用
hugo_Ephebe





發文: 6
積分: 0
於 2008-05-15 11:26 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
介紹一下Windsor,先去http://www.castleproject.org/去取得CastleProject-1.0-RC3.msi。安裝完畢後,你的VsIDE就產生兩種專案型別,一個是Monorail,一個是ActiveRocord。先來開一個新的Console專案。有以下幾個類別:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
   public enum Finger 
   {
       scissors,
       paper,
       rock
   }
 
   //猜拳遊戲的介面
   public interface IFingerGuessing
   {
       Finger NextFinger();
   }
 
   //猜拳遊戲的策略
   public interface IGuessingStrategy
   {
       Finger NextFinger();
   }
 
   //猜拳遊戲的實作
   public class FingerGuessing : IFingerGuessing
   {
       private IGuessingStrategy _oneGuessing;
       public FingerGuessing(IGuessingStrategy oneGuessing) 
       {
           _oneGuessing = oneGuessing;
       } 
 
       public Finger NextFinger() 
       {
           return _oneGuessing.NextFinger(); 
       }
    }
 
    //策略的實作
    public class FirstStrategy : IGuessingStrategy 
    {
        private Finger _myFinger;
        public FirstStrategy(string myFinger) 
        {
            _myFinger = (Finger)Enum.Parse(typeof(Finger),myFinger);
        }
 
        public Finger NextFinger() 
        {
            return _myFinger;
        }
    }

以上是一個經典的Strategy Pattern。如果不使用IOC的話,總是在程式的某個地方,你要各挑一個實作這兩個介面的物件,把他們結合在一起來操作。例如:
1
2
3
4
  IGuessingStrategy oneStrategy = new FirstStrategy();
  IFingerGuessing oneGame = new FingerGuessing(oneStrategy);
  
  Finger nextFinger = oneGame.NextFinger();

只要策略代入別的,下一拳就會不同,這是很好的責任分配。那用Windsor又如何呢?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
static void Main(string[] args)
  {
      //建立容器
      IWindsorContainer container =
          new WindsorContainer(
              new XmlInterpreter(
                  new ConfigResource("castle")));
 
            //加入组件
            container.AddComponent("GuessingGame", typeof(IFingerGuessing), typeof(FingerGuessing));
            container.AddComponent("MyStrategy", typeof(IGuessingStrategy), typeof(FirstStrategy));
 
            //取得组件,這個物件因為在建構式上有指定傳入IGuessingStrategy的介面,所以就自動合在一起了
            IFingerGuessing startGame = (IFingerGuessing)container["GuessingGame"];
 
            ////使用组件
            Console.Write(startGame.NextFinger().ToString()); 
 
            Console.ReadLine();
        }

附上設定檔
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<configuration>
  <configSections>
    <section
        name="castle"
  type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor" />
  </configSections>
 
  <castle>
    <components>
      <component id="MyStrategy">
        <parameters>
          <!--策略物件有個要傳進來的值吧,這裏可以設定傳進來-->
          <myFinger>rock</myFinger>
        </parameters>
      </component>
    </components>
  </castle>
</configuration>


TestIOCByWindsor.rar (179.06k)


reply to postreply to post
話題樹型展開
人氣 標題 作者 字數 發文時間
1909 Windsor中IOC的簡單應用 hugo_Ephebe 2679 2008-05-15 11:26
» JWorld@TW »  .Net Framework » .NET Open Source: Nhibernate, Castle

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8