听说基于Ioc+AOP编程是在半年前,IoC是个什么,至今没理解太深入,看到一些开源的项目都有用到Unity,interface横行。

试着写了个Demo小试了下Unity,原来是UnityContainer.Resolve<T>来创建对象实例。

从用途上来看,我就觉得Unity是个基于xml配置创建对象实例的地方,而避免在代码里直接引用子类。挺酷的,比工厂模式多了基于配置。

可自己在实际项目中真没怎么用到Unity,或许是真没必要,也是自己重构的能力有限。

对于Unity的设计思路也有些好奇,想山寨一下。

先山寨实现一下UnityContainer.Resolve<T>功能好了。

1.首先,考虑到要实现基于xml配置,所以最先创建xml结构,保存相关的信息到一个独立的xml中。

2.接下来,根据这个xml结构来创建相关辅助类,实现配置信息的保存和读取。使用XmlSerialize序列化和反序列化。

在父类中实现了Save和Load方法,通过XmlSerializer对子类的xml序列化和反序列化,实现xml配置文件的保存和读取。

public abstract class ConfigurationBase<TConfiguration>
{
private string _filename;
public ConfigurationBase(string filename)
{
_filename
= filename;
}

public bool Exist
{
get { return File.Exists(this._filename); }
}

public virtual void Save()
{
XmlSerializer serializer
= new XmlSerializer(typeof(TConfiguration));
using (TextWriter writer = new StreamWriter(this._filename))
{
serializer.Serialize(writer,
this);
}
}

public virtual object Load()
{
if (!Exist)
return null;

XmlSerializer serializer
= new XmlSerializer(typeof(TConfiguration));
using (TextReader reader = new StreamReader(this._filename))
{
return serializer.Deserialize(reader);
}
}
}

2.UnityContainer.Resolve<T>的山寨实现

public TInterface Resolve<TInterface>()
{
Type type
= typeof(TInterface);

//根据TInterface类型查找对应的RegisterEntry
RegisterEntry entry = this.Registers.FirstOrDefault(r => r.Name.Equals(type.Name, StringComparison.OrdinalIgnoreCase));

if (entry == null)
throw new NullReferenceException();

return (TInterface)Activator.CreateInstance(Type.GetType(entry.Mapto));
}

到此,山寨UnityContainer.Resolve<T>实现.

简单测试下,

Babii.Practices.Core.dll

public interface ILogger
{
void Log(string message);
}

Babii.Practices.Imps.dll

public class ConsoleLogger : ILogger
{
#region ILogger Members

public void Log(string message)
{
Console.Write(
"logging message.");
}

#endregion
}

Babii.Practices.WebSite.dll 

要注意的是,Babii.Practices.Imps.dll要拷贝放到web项目的bin下。

简单的山寨了下UnityContainer.Resolve<T>。但实际上Unity的UnityContainer.Resolve<T>的过程还是很复杂的,这里只是模仿学习其思路,在对着看unity的源码一步步的学习,我想这是个不错的学习方式,山寨不是想造轮子,只是模仿学习而已。

src 下载

新手第一次发文,欢迎拍砖,越多越好~~

作者: lovebabii 发表于 2011-03-08 13:31 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架