大概作用这样,通过注册一个接口和它的实现类与类的构造方法参数的类型, 用接口作为类型参数就能自动创建一个对象出来..
大家帮忙看一下有什么地方需要改进, 或有什么严重问题,或者说这根本就是个烂东西,没必要使用下去
    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() };
        }
    }

解决方案 »

  1.   

    你上一次的帖子,就不是个标准的单例模式,只是自己创建了一个列表记录创建过对象的类,我想你这么写,如果不是在做练习,那应该是你系统需要,但你这次的,实在有点看不出用途,如果想实现插件化,你可以提供一个标准接口,让外部实现,或是指定一个方法,例如CreateInstance,反射调用类的这个方法。看具体需要了,不要过度设计就好。
      

  2.   


    从简单的脚本编程转过来不久,设计模式这些也不太懂,所以有些愚蠢的菜鸟的想法请见谅。这个想要实现的是能全局设置生成对象的方式,比如BLL的对象,不用针对每一个类都写一个方法还是要感谢一下,好几个帖子都是你第一个回复,挺热心的。有批评建议还是好的,不然一直错下去都不知道