大概作用这样,通过注册一个接口和它的实现类与类的构造方法参数的类型, 用接口作为类型参数就能自动创建一个对象出来..
大家帮忙看一下有什么地方需要改进, 或有什么严重问题,或者说这根本就是个烂东西,没必要使用下去
class Program
{
static void Main(string[] args) { InstanceContainer ic = new InstanceContainer(); ic.Register<IUserService, UserService>(typeof(UserData)); var svc = ic.GetInstance<IUserService>();
var user = svc.GetUser(3); Console.WriteLine("{0} - {1}", user.UserId, user.UserName);
}
} public class InstanceContainer
{ private Dictionary<Type, Type[]> dictParms = new Dictionary<Type, Type[]>(); private Dictionary<Type, Type> dictInterfaces = new Dictionary<Type, Type>(); private Dictionary<Type, object> dict = new Dictionary<Type, object>(); public InstanceContainer Register<TInterface, T>(params Type[] parmTypes)
{
dictInterfaces.Add(typeof(TInterface), typeof(T));
dictParms.Add(typeof(T), parmTypes);
return this;
} public T GetInstance<T>()
{
object instance = null; if (dict.TryGetValue(typeof(T), out instance))
{
if (instance == null)
{
instance = CreateInstance<T>(false);
dict[typeof(T)] = instance;
}
}
else
{
instance = CreateInstance<T>(true);
}
return (T)instance;
} private T CreateInstance<T>(bool add)
{
object instance = null; var implType = dictInterfaces[typeof(T)];
var parmTypes = dictParms[implType]; var ctors = implType.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (ctors.Length > 0)
{
foreach (var ctor in ctors)
{
var parms = ctor.GetParameters(); if (parms.Length == parmTypes.Length)
{
if (this.IsMatched(parms, parmTypes))
{
object[] parmInstances = new object[parms.Length]; for (int i = 0; i < parmInstances.Length; i++)
{
parmInstances[i] = Activator.CreateInstance(parmTypes[i]);
} instance = ctor.Invoke(parmInstances);
break;
}
}
} if (add && instance != null)
{
dict.Add(typeof(T), instance);
}
}
return (T)instance;
} private bool IsMatched(ParameterInfo[] parms, Type[] parmTypes)
{
if (parms.Length == parmTypes.Length)
{
for (int i = 0; i < parms.Length; i++)
{
if (parms[i].ParameterType != parmTypes[i])
{
return false;
}
}
return true;
}
return false;
} } public class User
{
public int UserId { get; set; } public string UserName { get; set; }
}
public interface IUserService
{
User GetUser(int id);
}
public class UserService : IUserService
{ private UserData dao; public UserService()
{ } public UserService(UserData dao)
{
this.dao = dao;
} public User GetUser(int id)
{
return dao.GetUser(id);
}
}
public interface IUserData
{
User GetUser(int id);
}
public class UserData : IUserData
{
public User GetUser(int id)
{
return new User() { UserId = id, UserName = Guid.NewGuid().ToString() };
}
}
大家帮忙看一下有什么地方需要改进, 或有什么严重问题,或者说这根本就是个烂东西,没必要使用下去
class Program
{
static void Main(string[] args) { InstanceContainer ic = new InstanceContainer(); ic.Register<IUserService, UserService>(typeof(UserData)); var svc = ic.GetInstance<IUserService>();
var user = svc.GetUser(3); Console.WriteLine("{0} - {1}", user.UserId, user.UserName);
}
} public class InstanceContainer
{ private Dictionary<Type, Type[]> dictParms = new Dictionary<Type, Type[]>(); private Dictionary<Type, Type> dictInterfaces = new Dictionary<Type, Type>(); private Dictionary<Type, object> dict = new Dictionary<Type, object>(); public InstanceContainer Register<TInterface, T>(params Type[] parmTypes)
{
dictInterfaces.Add(typeof(TInterface), typeof(T));
dictParms.Add(typeof(T), parmTypes);
return this;
} public T GetInstance<T>()
{
object instance = null; if (dict.TryGetValue(typeof(T), out instance))
{
if (instance == null)
{
instance = CreateInstance<T>(false);
dict[typeof(T)] = instance;
}
}
else
{
instance = CreateInstance<T>(true);
}
return (T)instance;
} private T CreateInstance<T>(bool add)
{
object instance = null; var implType = dictInterfaces[typeof(T)];
var parmTypes = dictParms[implType]; var ctors = implType.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (ctors.Length > 0)
{
foreach (var ctor in ctors)
{
var parms = ctor.GetParameters(); if (parms.Length == parmTypes.Length)
{
if (this.IsMatched(parms, parmTypes))
{
object[] parmInstances = new object[parms.Length]; for (int i = 0; i < parmInstances.Length; i++)
{
parmInstances[i] = Activator.CreateInstance(parmTypes[i]);
} instance = ctor.Invoke(parmInstances);
break;
}
}
} if (add && instance != null)
{
dict.Add(typeof(T), instance);
}
}
return (T)instance;
} private bool IsMatched(ParameterInfo[] parms, Type[] parmTypes)
{
if (parms.Length == parmTypes.Length)
{
for (int i = 0; i < parms.Length; i++)
{
if (parms[i].ParameterType != parmTypes[i])
{
return false;
}
}
return true;
}
return false;
} } public class User
{
public int UserId { get; set; } public string UserName { get; set; }
}
public interface IUserService
{
User GetUser(int id);
}
public class UserService : IUserService
{ private UserData dao; public UserService()
{ } public UserService(UserData dao)
{
this.dao = dao;
} public User GetUser(int id)
{
return dao.GetUser(id);
}
}
public interface IUserData
{
User GetUser(int id);
}
public class UserData : IUserData
{
public User GetUser(int id)
{
return new User() { UserId = id, UserName = Guid.NewGuid().ToString() };
}
}
解决方案 »
- 为什么我用WebBrowser加载PPT会调用PowerPoint打开?
- C# 如何自动移去系统托盘失效的图标
- 学生求解关于验证邮箱的问题
- 在C#中DataGridView的控件如何实现字典列的翻译
- 一个关于OpenFileDialog的讨论话题,有兴趣的进来讨论讨论
- 各位高手帮帮忙啊----用户认证的问题啊
- 请问为什么动态生成的table的边框现实的时候很宽,打印时更宽,有什么解决的办法,请指点代码不合理处
- C#调用Delphi写的DLL时...参数对应问题...
- SOAP client 连接
- 有没有Windows消息扫盲的资料看?
- 同一页面的2个类似butto调用js 打开同一的新页,速度不同一!
- 如何将RTF编码格式的字转换成汉字?
从简单的脚本编程转过来不久,设计模式这些也不太懂,所以有些愚蠢的菜鸟的想法请见谅。这个想要实现的是能全局设置生成对象的方式,比如BLL的对象,不用针对每一个类都写一个方法还是要感谢一下,好几个帖子都是你第一个回复,挺热心的。有批评建议还是好的,不然一直错下去都不知道