山寨UnityContainer.Resolve<T>的实现
听说基于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的源码一步步的学习,我想这是个不错的学习方式,山寨不是想造轮子,只是模仿学习而已。
新手第一次发文,欢迎拍砖,越多越好~~