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");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

afeng124

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值