代码改变世界

Unity 1.2使用初探(1)

2009-03-12 15:28  Kevin Zhou  阅读(2451)  评论(2编辑  收藏  举报

最近赋闲在家,突然想看一点东西。

以前都有用Enterprise Library,对于PolicyInject可使项目辅助功Log,Auth等以更优雅的方式,叹其巧妙。现在微软出了Unity1.2注入容器,但是我在使用这个框架上还是个新手,所以在此学习如何应用。(下载地址: http://www.codeplex.com/unity )

下面是我的一些初步使用,主要参照在 UnityDocs,路过的各位高手哪位有比较完好的中午资料,请是否可共享一下~~;

1,第一个Demo;

以下是一个Demo:首先定义1个接口,1个实现:

 

public interface ILogService

{

void Write(string message);

}

 

public class CnsLogService: ILogService

{

#region ILogService 成员

 

public void Write(string message) {

Console.WriteLine(String.Format("Cns-exception msg:{0}", message));

}

 

#endregion

}

 

然后我们可以这样应用Unity:

public static void Main(string[] args) {

 

IUnityContainer myContainer = new UnityContainer();

myContainer.RegisterType<ILogService, CnsLogService>();

ILogService myServiceInstance = myContainer.Resolve<ILogService>();

myServiceInstance.Write("oh,exception occured!");

}

运行结果如下图:

 

2, 注入链

发现文档有这样一段内容

大体意思就是你可以注册一连串的类型。代码如上所示:

那么来实现一下:

先再实现一次ILogService

public class DataLogService:ILogService

{

#region ILogService 成员

 

public void Write(string message) {

DailyPractice.Utility.Log.AddLog(message);

}

 

#endregion

}

 

namespace DailyPractice.Utility

{

public class Log

{

public static void AddLog(string message) {

//insert into Log(message) values(@message)

Console.WriteLine(String.Format("Data-exception msg:{0}", message));

}

}

}

 

然后实现一下注册:

public static void Main(string[] args) {

IUnityContainer myContainer = new UnityContainer();

myContainer.RegisterType<ILogService, CnsLogService>()

.RegisterType<ILogService, DataLogService>();

ILogService myServiceInstance = myContainer.Resolve<ILogService>();

myServiceInstance.Write("oh,exception occured!");

 

}

结果执行为:

非常意外: CnsLogService并没有执行

然后把代码改成

public static void Main(string[] args) {

IUnityContainer myContainer = new UnityContainer();

myContainer.RegisterType<ILogService, CnsLogService>()

.RegisterType<ILogService, DataLogService>();

IEnumerable<ILogService> myServiceInstances = myContainer.ResolveAll<ILogService>();

foreach (ILogService myServiceInstance in myServiceInstances) { myServiceInstance.Write("haha, you have an exception 了吧!"); }

}

执行结果是:

什么都没有执行???

看过terrylee的blog:http://www.cnblogs.com/terrylee/archive/2008/02/21/unity-application-block-part1.html

发现还有一种实现方式,先看代码:

public static void Main(string[] args) {

IUnityContainer myContainer = new UnityContainer();

myContainer.RegisterType<ILogService, CnsLogService>("CnsLogService")

.RegisterType<ILogService, DataLogService>("DataLogService");

IEnumerable<ILogService> myServiceInstances = myContainer.ResolveAll<ILogService>();

foreach (ILogService myServiceInstance in myServiceInstances) { myServiceInstance.Write("haha, you have an exception 了吧!"); }

}

执行结果是:

执行结果正常,

所以现在就来找原因:terrylee's blog有这么一段

    除了可以获取单个对象实例之外,我们还可以一次获取容器中所有与某一接口映射的所有对象实例,但是需要依赖于在注册映射时提供的名称,如果没有指定名称,通过GetAll方法不会被获取到。

 

本次先到这里。