Chinaz.com - 中国站长站

匿名投稿 投稿指南 RSS订阅 站长资讯通告:
搜索: 您的位置主页>网络编程>.Net编程>阅读资讯:.NET平台依赖注入机制及IoC的设计与实现

.NET平台依赖注入机制及IoC的设计与实现

2008-06-19 17:34:48 来源:博客园 作者:T2噬菌体 【 评论:1

封装依赖注入代码
因为很多依赖注入代码非常相似,为了减少重复性代码,我们将可复用的代码先封装在一个类中。具体代码如下(这个类放在Factory工程下):

using System;
using System.Configuration;
using System.Reflection;
using System.Web;
using System.Web.Caching;
using NGuestBook.Utility;

namespace NGuestBook.Factory
{
    /**//// <summary>
    /// 依赖注入提供者
    /// 使用反射机制实现
    /// </summary>
    public sealed class DependencyInjector
    {
        /**//// <summary>
        /// 取得数据访问层对象
        /// 首先检查缓存中是否存在,如果不存在,则利用反射机制返回对象
        /// </summary>
        /// <param name="className">数据访问类名称</param>
        /// <returns>数据访问层对象</returns>
        public static object GetDALObject(string className)
        {
            /**//// <summary>
            /// 取得数据访问层名称,首先检查缓存,不存在则到配置文件中读取
            /// 缓存依赖项为Web.Config文件
            /// </summary>
            object dal = CacheAccess.GetFromCache("DAL");
            if (dal == null)
            {
                CacheDependency fileDependency = new CacheDependency(HttpContext.Current.Server.MapPath("Web.Config"));
                dal = ConfigurationManager.AppSettings["DAL"];
                CacheAccess.SaveToCache("DAL", dal, fileDependency);
            }

            /**//// <summary>
            /// 取得数据访问层对象
            /// </summary>
            string dalName = (string)dal;
            string fullClassName = dalName + "." + className;
            object dalObject = CacheAccess.GetFromCache(className);
            if (dalObject == null)
            {
                CacheDependency fileDependency = new CacheDependency(HttpContext.Current.Server.MapPath("Web.Config"));
                dalObject = Assembly.Load(dalName).CreateInstance(fullClassName);
                CacheAccess.SaveToCache(className, dalObject, fileDependency);
            }

            return dalObject;
        }

        /**//// <summary>
        /// 取得业务逻辑层对象
        /// 首先检查缓存中是否存在,如果不存在,则利用反射机制返回对象
        /// </summary>
        /// <param name="className">业务逻辑类名称</param>
        /// <returns>业务逻辑层对象</returns>
        public static object GetBLLObject(string className)
        {
            /**//// <summary>
            /// 取得业务逻辑层名称,首先检查缓存,不存在则到配置文件中读取
            /// 缓存依赖项为Web.Config文件
            /// </summary>
            object bll = CacheAccess.GetFromCache("BLL");
            if (bll == null)
            {
                CacheDependency fileDependency = new CacheDependency(HttpContext.Current.Server.MapPath("Web.Config"));
                bll = ConfigurationManager.AppSettings["BLL"];
                CacheAccess.SaveToCache("BLL", bll, fileDependency);
            }

            /**//// <summary>
            /// 取得业务逻辑层对象
            /// </summary>
            string bllName = (string)bll;
            string fullClassName = bllName + "." + className;
            object bllObject = CacheAccess.GetFromCache(className);
            if (bllObject == null)
            {
                CacheDependency fileDependency = new CacheDependency(HttpContext.Current.Server.MapPath("Web.Config"));
                bllObject = Assembly.Load(bllName).CreateInstance(fullClassName);
                CacheAccess.SaveToCache(className, bllObject, fileDependency);
            }

            return bllObject;
        }
    }
}

实现工厂
      下面使用两个辅助类,实现数据访问层工厂和业务逻辑层工厂。

using System;
using NGuestBook.IDAL;

namespace NGuestBook.Factory
{
    /**//// <summary>
    /// 数据访问层工厂,用于获取相应的数据访问层对象
    /// 使用Abstract Factory设计模式+Facace设计模式+反射机制+缓存机制设计
    /// </summary>
    public sealed class DALFactory
    {
        /**//// <summary>
        /// 获取管理员数据访问层对象
        /// </summary>
        /// <returns>管理员数据访问层对象</returns>
        public static IAdminDAL CreateAdminDAL()      
 {
            return (IAdminDAL)DependencyInjector.GetDALObject("AdminDAL");
      }
        /**//// <summary>
        /// 获取留言数据访问层对象
        /// </summary>
        /// <returns>留言数据访问层对象</returns>
        public static IMessageDAL CreateMessageDAL()
        {
            return (IMessageDAL)DependencyInjector.GetDALObject("MessageDAL");
        }

        /**//// <summary>
        /// 获取评论数据访问层对象
        /// </summary>
        /// <returns>评论数据访问层对象</returns>
        public static ICommentDAL CreateCommentDAL()
        {
            return (ICommentDAL)DependencyInjector.GetDALObject("CommentDAL");
        }
    }
}

using System;
using NGuestBook.IBLL;

namespace NGuestBook.Factory
{
    /**//// <summary>
    /// 业务逻辑层工厂,用于获取相应的业务逻辑层对象
    /// 使用Abstract Factory设计模式+Facace设计模式+反射机制+缓存机制设计
    /// </summary>
    public sealed class BLLFactory
    {
        /**//// <summary>
        /// 获取管理员业务逻辑层对象
        /// </summary>
        /// <returns>管理员业务逻辑层对象</returns>
        public static IAdminBLL CreateAdminBLL()
        {
            return (IAdminBLL)DependencyInjector.GetBLLObject("AdminBLL");
        }

        /**//// <summary>
        /// 获取留言业务逻辑层对象
        /// </summary>
        /// <returns>留言业务逻辑层对象</returns>
        public static IMessageBLL CreateMessageBLL()
        {
            return (IMessageBLL)DependencyInjector.GetBLLObject("MessageBLL");
        }

        /**//// <summary>
        /// 获取评论业务逻辑层对象
        /// </summary>
        /// <returns>评论业务逻辑层对象</returns>
        public static ICommentBLL CreateCommentBLL()
        {
            return (ICommentBLL)DependencyInjector.GetBLLObject("CommentBLL");
        }
    }
}

Tags:依赖注入机制及IoC的设计与实现    
责任编辑:谷汶锴
  • 请文明参与讨论,禁止漫骂攻击。 用户名:新注册) 密码: 匿名:
    评论总数: [ 查看全部 ] 网友评论
    关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助