珂珂的个人博客 - 一个程序猿的个人网站

通过配置创建IOC 实例

   基于分层的接口开发,我们需要一个IOC 来管理,到处都 new对象显然是不明智的做法。虽然有很多第三方IOC框架,不过还是自己来实现一个简单的。

   考虑到性能问题,不能每次都重新创建,需要一定的缓存技术。asp.net 中有一个缓存类System.Web.Caching.Cache,在winform或是wpf中也可以使用,但要引用System.Web.dll   这个dll是为web设计的,用来引用在桌面应用程序里面,似乎不太合适,  经过搜索,知道了微软在net 4 里面添加一个缓存类MemoryCache   类。它们都能监测文件的改变,所以改变ioc的配置文件都会实时生效。

      我把IOC配置文件放在了App_Data目录下的一个自建xml文件,为什么放这个目录呢,因为默认情况下该目录不允许通过URL访问。先看看我博客怎么配置的

                              

                            


前面一个是接口,后面是接口的实现,这样如果想改变接口的实现只需要更改这个配置文件的后面一段。

IocHelper 类

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Caching;
using System.Text;
using System.Xml;

namespace FYJ.Framework.Core
{
    public class IocHelper where T : class
    {
        ///         /// 获取一个实例
        ///         public static T Instance
        {
            get
            {
                string iocFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data/Ioc.xml");
                ObjectCache cache = MemoryCache.Default;
                string fullName = typeof(T).FullName;
                if (cache[fullName] == null)
                {
                    CacheItemPolicy policy = new CacheItemPolicy();

                    List filePaths = new List();
                    filePaths.Add(iocFilePath);

                    policy.ChangeMonitors.Add(new HostFileChangeMonitor(filePaths));

                    T instace = Create();

                    cache.Set(fullName, instace, policy);
                }

                return cache[fullName] as T;
            }
        }


        ///         /// 创建一个新实例
        ///         ///         ///         ///         public static T Create()
        {
            string iocFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data/Ioc.xml");
            string fullName = typeof(T).AssemblyQualifiedName;
            XmlDocument doc = new XmlDocument();
            doc.Load(iocFilePath);
            foreach (XmlNode node in doc.GetElementsByTagName("Service"))
            {
                if (Type.GetType(node.Attributes["name"].InnerText).AssemblyQualifiedName == fullName)
                {
                    Type instanceType = Type.GetType(node.Attributes["type"].InnerText);
                    T o = (T)Activator.CreateInstance(instanceType);

                    return o;
                }
            }

            return default(T);
        }
    }
}




上一篇:多线程域名查询工具

下一篇:个人代码全部开源


0 评论

查看所有评论

给个评论吧