博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Castle~实现IoC容器
阅读量:6476 次
发布时间:2019-06-23

本文共 5285 字,大约阅读时间需要 17 分钟。

IOC的容器确实不少,,,Castle 等等,前两种组件如何实现IOC在我之前的文章中已经做过说明了,今天主要来说一下Castle如何去实现IoC,事实上Castle是小微的一个开源项目,最早接触它是在orchard项目中,在orchard里主要用在动态代理方法拦截上,当然这是castle最重要的作用,事实上它当然也可以实现IoC了,不过,你要下载一个Castle.Windsor.dll,它主要实现ioc功能的。

说干就干,事情和前两个组件的工作场景是相似的,一个irepository,多种实现方式,ef,linq,nhibernate,ado.net等等,你可以根据你的需要去实现它,这只是最大层次上的多态,代码可能是这样:

泛型类版本

1 #region 泛型注入 2     public interface IRepository
3 { 4 void Insert(T entity); 5 } 6 7 public class EFRepository
: IRepository
8 { 9 #region IRepository
成员10 11 public void Insert(T entity)12 {13 Console.WriteLine("EFRepository泛型注入" + entity);14 }15 16 #endregion17 }18 #endregion

非泛型版本(泛型方法版本)

1 #region 非泛型注入 2     public interface IRepository 3     { 4         void Insert
(T entity); 5 } 6 7 public class EFRepository : IRepository 8 { 9 #region IRepository
成员10 11 public void Insert
(T entity)12 {13 Console.WriteLine("EFRepository非泛型注入" + entity);14 }15 16 #endregion17 }18 19 public class LINQRespository : IRepository20 {21 #region IRepository
成员22 23 public void Insert
(T entity)24 {25 Console.WriteLine("LINQRepository非泛型注入" + entity);26 }27 28 #endregion29 }30 #endregion

对于这两种类型,在castle配置上也略有不同,看代码:

上面的代码是架构层次的,而对于具体的业务,如用户方面的业务可能有多个版本的考虑,可能有代缓存的,不代缓存的,可能有发邮件的,也可能有发短信的,这是具体业务层次的多态,代码可能是这样的:

1 #region 服务是泛型,类型不是泛型 2  3     public interface IMessageService
4 { 5 void Sending(T entity); 6 } 7 public class UserService : IMessageService
8 { 9 10 11 #region IMessageService
成员12 13 public void Sending(User entity)14 {15 Console.WriteLine("用户模块发消息,采用E-Mail方式");16 }17 18 #endregion19 }20 21 public class ProductService : IMessageService
22 {23 #region IMessageService
成员24 25 public void Sending(Product entity)26 {27 Console.WriteLine("产品模块发消息采用短信");28 }29 30 #endregion31 }32 #endregion

看上面的代码,一个发消息的业务,它对于不同的业务对象,可能有不同的实现方式,而这种方法,我们可以在配置文件中进行设置:

1       

整個配置文件內容如下:

而castle容器的代码也封装了一下,改了上人的低版本的,呵呵 

///     /// IOC容器    ///     public sealed class Container    {        #region Fields & Properies        ///         /// WindsorContainer object        ///         private WindsorContainer windsor;        private IKernel kernel;        public IKernel Kernel        {            get { return kernel; }        }        ///         /// 容器实例        ///         private static readonly Container instance = new Container();        public static Container Instance        {            get { return Container.instance; }        }        #endregion        #region Constructors        ///         /// Constructor Method.        /// Initialization IOC.        ///         public Container()        {            try            {                Castle.Core.Resource.ConfigResource source = new Castle.Core.Resource.ConfigResource();                XmlInterpreter interpreter = new XmlInterpreter(source);                windsor = new WindsorContainer(interpreter);                kernel = windsor.Kernel;            }            catch (Exception)            {                throw;            }        }        #endregion        #region Public Methods        ///         /// Returns a component instance by the type of service.        ///         /// 
///
public T Resolve
() { return kernel.Resolve
(); } ///
/// Release resource that be container used. /// public void Dispose() { kernel.Dispose(); } #endregion #region Private Methods ///
/// Returns a component instance by the service name. /// ///
///
private object Resolve(Type service) { return kernel.Resolve(service); } ///
/// Returns a component instance by the service name. /// ///
///
private object Resolve(String key) { return kernel.Resolve
(key); } #endregion }

在程序中调用它的代码为:

       IRepository iRepository = Container.Instance.Resolve
(); iRepository.Insert
(new User { Name = "ok" }); IRepository
iRepository1 = Container.Instance.Resolve
>(); iRepository1.Insert(new User { Name = "ok" }); IMessageService
r = (IMessageService
)Container.Instance.Resolve
>(); r.Sending(new User { Name = "ok" });

运行的结果为:

感谢您的阅读!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:,如需转载请自行联系原博主。

你可能感兴趣的文章
幻方(zjut1005) 与 反幻方(hdu 3927)
查看>>
vue中nextTick的使用(转载)
查看>>
python修行之路(六 三级菜单实例)
查看>>
openssl编译安装-各种蛋疼
查看>>
MongoDB 概念解析
查看>>
配置_DruidDataSource参考配置
查看>>
《深入理解Oracle 12c数据库管理(第二版)》PDF
查看>>
电影:为人师表
查看>>
Description of security events in Windows 2003/7/2008
查看>>
(笑话)我老公不在家,你快点上来!
查看>>
sql里面的模糊查询 用到通配符 格式如右边:'%"&变量名称&"%'
查看>>
Tsung测试之配置文件
查看>>
C#图像处理:截图程序(包含鼠标)
查看>>
DotNetBar for Windows Forms 12.7.0.10_冰河之刃重打包版原创发布-带官方示例程序版
查看>>
HTML save data to CSV or excel
查看>>
python库参考学习网址
查看>>
微信小程序之数独挑战九宫格
查看>>
海量数据处理方法总结
查看>>
通过LinQ查询字符出现次数
查看>>
【算法导论】第五章
查看>>