秋海

博客园 首页 新随笔 联系 订阅 管理

首先,感谢吕老师的你真的了解Ioc与AOP吗?。本人完全是根据吕老师讲的学习,以加深理解。(吕老师不要告我抄袭呦)
1.如果有个需求,就是返回中文问候语。我开始肯定会创建一个SayHello类库,SayHello类,就有一个方法。SayHelloTo()。如下。
namespace SayHello
{
    public class SayHello
    {
        public string SayHelloTo(string Name)
        {
            return "你好!"+Name;
        }
    }
}
创建个控制台项目IOC_Test,应用SayHello程序集,并调用。
namespace IOC_Test
{
    class Program
    {
        static void Main(string[] args)
        {
            SayHello.SayHello say = new SayHello.SayHello();
            Console.WriteLine(say.SayHelloTo("秋海"));
        }
    }
}
2.如果需求改变了,问候语可能会是中文,也可能是英文。修改代码。
第一反应,可能在原有的SayHello类中增加一个英文的方法。修改如下
namespace SayHello
{
    public class SayHello
    {
        public string CSayHelloTo(string Name)
        {
            return "你好!" + Name;
        }
        public string ESayHelloTo(string Name)
        {
            return "Hello!" + Name;
        }
}
这种情况下,中文英文切换的所有调用SayHello类的say.SayHelloTo("秋海")方法都得修改成say.ESayHelloTo("秋海");这种设计肯定不符合编程思想,不易维护。
3.为了应对这种情况。我们新加一个类库SayHelloGenerator,增加两个类,代码如下
namespace SayGenerator
{
    public  class CSayHelloGenerator
    {
        public string SayHelloTo(string Name)
        {
            return "你好!" + Name;
        }
    }
   public  class ESayHelloGenerator
    {
        public string  SayHelloTo(string Name)
        {
            return "Hello!"+Name;
        }
    }
}
修改SayHello如下:
namespace SayHello
{
    public class SayHello
    {
        private CSayHelloGenerator _generate;
        public CSayHelloGenerator Generate
        {
            get
            {
                if (_generate == null)
                {
                    _generate = new CSayHelloGenerator();
                }
                return _generate;
            }
        }
        public string SayHelloTo(string Name)
        {
            return Generate.SayHelloTo(Name);
        }
    }
}
这样修改后,掉用SayHello的方式不变,如果中英文切换只修改SayHello。这样比较易维护。
4.但这样修改的地方,还是不太方便,为了降低耦合性,采用“增加针对接口编程”思路,修改代码。
增加接口ISayHelloGenerator。
namespace SayGenerator
{
    public interface ISayHelloGenerator
    {
       string SayHelloTo(string Name);
    }
}
修改ESayHelloGenerator和CSayHelloGenerator,实现接口。

namespace SayGenerator
{
    public  class ESayHelloGenerator:ISayHelloGenerator
    {
        #region ISayHelloGenerator 成员
       
        public string SayHelloTo(string Name)
        {
            return "Hello!" + Name;
        }

        #endregion
    }
    public  class CSayHelloGenerator:ISayHelloGenerator
    {
        #region ISayHelloGenerator 成员

        public string SayHelloTo(string Name)
        {
            return "你好!" + Name;
        }

        #endregion
    }
}
修改SayHello类的方法。如下
namespace SayHello
{
    public class SayHello
    {
        private ISayHelloGenerator _generate;
        public ISayHelloGenerator Generate
        {
            get
            {
                if (_generate == null)
                {
                    _generate = new CSayHelloGenerator();
                }
                return _generate;
            }
        }
        public string SayHelloTo(string Name)
        {
            return Generate.SayHelloTo(Name);
        }
    }
}
这样,如果需要中英文切换的时候,只需要修改一句,_generate = new CSayHelloGenerator()。这样就实现了针对接口编程。

5.这样问题依旧存在。整个项目中要不全部是中文,要不全部是英文。这样肯定是不行。
SayHello类代码修改如下:

 public class SayHello
    {
        private ISayHelloGenerator _generate;
        public ISayHelloGenerator Generate
        {
            get
            {
                return _generate;
            }
            set
            {
                _generate = value;
            }

        }
        public string SayHelloTo(string Name)
        {
            if (Generate != null)
            {
                return Generate.SayHelloTo(Name);
            }
            else
            {
                return "Error ";
            }
        }
    }
调用时,指定类型
            SayHello.SayHello say = new SayHello.SayHello();
            say.Generate = new SayGenerator.ESayHelloGenerator();
            Console.WriteLine(say.SayHelloTo("qiuhai"));
            say.Generate = new SayGenerator.CSayHelloGenerator();
            Console.WriteLine(say.SayHelloTo("qiuhai"));
输出:Hello,qiuhai;你好,qiuhai;

posted on 2011-02-15 16:29  秋海  阅读(221)  评论(0)    收藏  举报