C#自定義應用程序上下文對象+IOC自己實現依賴注入


以前的好多代碼都丟失了,加上最近時間空一些,於是想起整理一下以前的個人半拉子項目,試試讓它們重生。自從養成了架構師視覺 搭建框架之后,越來 越看不上以前搭的框架了。先擼個上下文對象加上實現依賴注入。由於還是要依賴.net 4,所以像Autofac這樣的就用不了,於是仿照着實現了。

 

    /// <summary>
    /// 自定義應用程序上下文對象
    /// </summary>
    public class AppContextExt : IDisposable
    {
        /// <summary>
        /// app.config讀取
        /// </summary>
        public Configuration AppConfig { get; set; }
        /// <summary>
        /// 真正的ApplicationContext對象
        /// </summary>
        public ApplicationContext Application_Context { get; set; }
        //服務集合
        public static Dictionary<Type, object> Services = new Dictionary<Type, object>();
        //服務訂閱事件集合
        public static Dictionary<Type, IList<Action<object>>> ServiceEvents = new Dictionary<Type, IList<Action<object>>>();
        //上下文對象的單例
        private static AppContextExt _ServiceContext = null;
        private readonly static object lockObj = new object();
        /// <summary>
        /// 禁止外部進行實例化
        /// </summary>
        private AppContextExt()
        {
        }
        /// <summary>
        /// 獲取唯一實例,雙鎖定防止多線程並發時重復創建實例
        /// </summary>
        /// <returns></returns>
        public static AppContextExt GetInstance()
        {
            if (_ServiceContext == null)
            {
                lock (lockObj)
                {
                    if (_ServiceContext == null)
                    {
                        _ServiceContext = new AppContextExt();
                    }
                }
            }
            return _ServiceContext;
        }
        /// <summary>
        /// 注入Service到上下文
        /// </summary>
        /// <typeparam name="T">接口對象</typeparam>
        /// <param name="t">Service對象</param>
        /// <param name="servicesChangeEvent">服務實例更新時訂閱的消息</param>
        public static void RegisterService<T>(T t, Action<object> servicesChangeEvent = null) where T : class
        {
            if (t == null)
            {
                throw new Exception(string.Format("未將對象實例化,對象名:{0}.", typeof(T).Name));
            }
            if (!Services.ContainsKey(typeof(T)))
            {
                try
                {
                    Services.Add(typeof(T), t);
                    if (servicesChangeEvent != null)
                    {
                        var eventList = new List<Action<object>>();
                        eventList.Add(servicesChangeEvent);
                        ServiceEvents.Add(typeof(T), eventList);
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            if (!Services.ContainsKey(typeof(T)))
            {
                throw new Exception(string.Format("注冊Service失敗,對象名:{0}.", typeof(T).Name));
            }
        }
        /// <summary>
        /// 動態注入dll中的多個服務對象
        /// </summary>
        /// <param name="serviceRuntime"></param>
        public static void RegisterAssemblyServices(string serviceRuntime)
        {
            if (serviceRuntime.IndexOf(".dll") != -1 && !File.Exists(serviceRuntime))
                throw new Exception(string.Format("類庫{0}不存在!", serviceRuntime));
            try
            {
                Assembly asb = Assembly.LoadFrom(serviceRuntime);
                var serviceList = asb.GetTypes().Where(t => t.GetCustomAttributes(typeof(ExportAttribute), false).Any()).ToList();
                if (serviceList != null && serviceList.Count > 0)
                {
                    foreach (var service in serviceList)
                    {
                        var ifc = ((ExportAttribute)service.GetCustomAttributes(typeof(ExportAttribute), false).FirstOrDefault()).ContractType;
                        //使用默認的構造函數實例化
                        var serviceObject = Activator.CreateInstance(service, null);
                        if (serviceObject != null)
                            Services.Add(ifc, serviceObject);
                        else
                            throw new Exception(string.Format("實例化對象{0}失敗!", service));
                    }
                }
                else
                {
                    throw new Exception(string.Format("類庫{0}里沒有Export的Service!", serviceRuntime));
                }
            }
            catch (Exception ex)
            { 
                throw ex;
            } 
        }
        /// <summary>
        /// 獲取Service的實例
        /// </summary>
        /// <typeparam name="T">接口對象</typeparam>
        /// <returns></returns>
        public static T Resolve<T>()
        {
            if (Services.ContainsKey(typeof(T)))
                return (T)Services[typeof(T)];
            return default(T);
        }
        /// <summary>
        /// 重置Service對象,實現熱更新
        /// </summary>
        /// <typeparam name="T">接口對象</typeparam>
        /// <param name="t">新的服務對象實例</param>
        public static void ReLoadService<T>(T t)
        {
            if (t == null)
            {
                throw new Exception(string.Format("未將對象實例化,對象名:{0}.", typeof(T).Name));
            }
            if (Services.ContainsKey(typeof(T)))
            {
                try
                {
                    Services[typeof(T)] = t;
                    if (ServiceEvents.ContainsKey(typeof(T)))
                    {
                        var eventList = ServiceEvents[typeof(T)];
                        foreach (var act in eventList)
                        {
                            act.Invoke(t);
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            else if (!Services.ContainsKey(typeof(T)))
            {
                throw new Exception(string.Format("Service實例不存在!對象名:{0}.", typeof(T).Name));
            }
        }
        /// <summary>
        /// 激活上下文
        /// </summary>
        public void Start()
        {
            GetInstance();
        }
        /// <summary>
        /// 激活上下文
        /// </summary>
        /// <param name="appContext">真正的ApplicationContext對象</param>
        public void Start(ApplicationContext appContext)
        {
            Application_Context = appContext;
            GetInstance();
        }
        /// <summary>
        /// 激活上下文
        /// </summary>
        /// <param name="config">Configuration</param>
        public void Start(Configuration config)
        {
            AppConfig = config;
            GetInstance();
        }
        /// <summary>
        /// 激活上下文
        /// </summary>
        /// <param name="appContext">真正的ApplicationContext對象</param>
        /// <param name="config">Configuration</param>
        public void Start(ApplicationContext appContext, Configuration config)
        {
            AppConfig = config;
            Application_Context = appContext;
            GetInstance();
        }
        /// <summary>
        /// Using支持
        /// </summary>
        public void Dispose()
        {
            Services.Clear();
            ServiceEvents.Clear();
            if (Application_Context != null)
            {
                Application_Context.ExitThread();
            }
        }
    }

使用:

 AppContextExt.GetInstance().Start();
            AppContextExt.RegisterAssemblyServices(AppDomain.CurrentDomain.BaseDirectory + "ModuleService.dll");
ILogService svr = AppContextExt.Resolve<ILogService>();
            if (svr != null)
                svr.LogInfo("OK");

解決方案截圖:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM