可扩展的 IOC(1)

引用 dll
Microsoft.Practices.Unity.dll
Autofac.dll

IContainer  接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace  Ctrip.HotelReservation.Ioc
{
    public interface IContainer
    {
        TService Resolve<TService>();

        TService Resolve<TService>(string serviceLine);

        object Resolve(Type type);

        void RegisterType(Type type);
    }
}

IoCFactory 工厂

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace  Ctrip.HotelReservation.Ioc
{
    /// <summary>
    /// IoCFactory  implementation
    /// </summary>
    public sealed class IoCFactory
    {
        #region Singleton

        static readonly IoCFactory instance = new IoCFactory();

        /// <summary>
        /// Get singleton instance of IoCFactory
        /// </summary>
        public static IoCFactory Instance
        {
            get
            {
                return instance;
            }
        }

        #endregion

        #region Members

        IContainer _CurrentContainer;

        /// <summary>
        /// Get current configured IContainer
        /// <remarks>
        /// At this moment only IoCUnityContainer existss
        /// </remarks>
        /// </summary>
        public IContainer CurrentContainer
        {
            get
            {
                return _CurrentContainer;
            }
        }

        #endregion

        #region Constructor

        /// <summary>
        /// 这里可以指定具体的容器,是用Unity,还是Autofac
        /// </summary>
        static IoCFactory() { }
        IoCFactory()
        {
            _CurrentContainer = new IoCUnityContainer();
        }

        #endregion

    }
}

IoCUnityContainer 容器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Practices.Unity;
using Ctrip.HotelReservation.Interface.DAL;
using Ctrip.HotelReservation.DAL;
using Ctrip.HotelReservation.Interface.DB;
using Ctrip.HotelReservation.DB;
using Ctrip.HotelReservation.SOA1;
using Ctrip.HotelReservation.Interface.SOA1;
using System.Web.Mvc;
using Ctrip.HotelReservation.Biz.General.Interface;
using Ctrip.HotelReservation.Biz;
using Ctrip.HotelReservation.IBiz;
using Ctrip.HotelReservation.Biz.GroupOrder;

namespace Ctrip.HotelReservation.Ioc
{
    public class IoCUnityContainer : IContainer
    {
        IUnityContainer Container { get; set; }
        public IoCUnityContainer()
        {
            Container = new UnityContainer();
            ConfigureRootContainer(Container);
        }

        void ConfigureRootContainer(IUnityContainer container)
        {           满足开闭耦合,各个数据源的切换方便。大的改动可以方便的切换回去
            #region 注册业务逻辑类

            #region Dal层
            container.RegisterType<IUserDAL, UserDAL>();
            #endregion

            #region DB层
            container.RegisterType<ICrmDB, CrmDB>();
            container.RegisterType<ICrmbiDB, CrmbiDB>();
            container.RegisterType<IObookingDB, ObookingDB>();
            container.RegisterType<IOrderDB, OrderDB>();
            container.RegisterType<IProductDB, ProductDB>();
            container.RegisterType<IUserDB, UserDB>();
            #endregion

            #region SOA1.0 层
            container.RegisterType<IUserInvoices, UserInvoices>();
            container.RegisterType<IUserAddressInfo, UserAddressInfo>();
            container.RegisterType<IContactInfo, ContactInfo>();
            container.RegisterType<IClientInfo, ClientInfo>();

            container.RegisterType<ISmallCorpSMCorporationID, SmallCorpSMCorporationID>();
            container.RegisterType<ITravelMoneyUser, TravelMoneyUser>();
            container.RegisterType<IRead, Read>();
            #endregion

            #endregion

            #region 注册数据组装类

            #endregion

            #region 业务处理

            container.RegisterType<IBaseDataBiz, BaseDataBiz>();

            container.RegisterType<IOrderBiz, CreateOrderBiz>("GroupOrder");
            container.RegisterType<IOrderBiz, CreateOrderBookingBiz>("BookingGroupOrder");

            #endregion

        }

        public TService Resolve<TService>()
        {
            return Container.Resolve<TService>();
        }

        public TService Resolve<TService>(string ServiceLine)
        {
            return Container.Resolve<TService>(ServiceLine);
        }

        public object Resolve(Type type)
        {
            return Container.Resolve(type, null);
        }

        public void RegisterType(Type type)
        {
            Container.RegisterType(type, new TransientLifetimeManager());
        }
    }
}

IoCAutofacContainer 容器

using Autofac;
using Ctrip.HotelReservation.Biz.GroupOrder;
using Ctrip.HotelReservation.DAL;
using Ctrip.HotelReservation.DB;
using Ctrip.HotelReservation.IBiz;
using Ctrip.HotelReservation.Interface.DAL;
using Ctrip.HotelReservation.Interface.DB;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace  Ctrip.HotelReservation.Ioc
{
    public sealed class IoCAutofacContainer : IContainer
    {
        ContainerBuilder Container { get; set; }

        Autofac.IContainer builder { get; set; }
        public IoCAutofacContainer()
        {
            Container = new ContainerBuilder();
            ConfigureRootContainer(Container);
        }

        void ConfigureRootContainer(ContainerBuilder container)
        {
            #region 注册业务逻辑类

              #region Dal层
              container.RegisterType<UserDAL>().As<IUserDAL>();
            #endregion

            #region DB层
              container.RegisterType<CrmDB>().As<ICrmDB>();
            container.RegisterType<CrmbiDB>().As<ICrmbiDB>();
            //container.RegisterType<IObookingDB, ObookingDB>();
            //container.RegisterType<IOrderDB, OrderDB>();
            //container.RegisterType<IProductDB, ProductDB>();
            //container.RegisterType<IUserDB, UserDB>();
            #endregion

            #region SOA1.0 层
            //container.RegisterType<IUserInvoices, UserInvoices>();
            //container.RegisterType<IUserAddressInfo, UserAddressInfo>();
            //container.RegisterType<IContactInfo, ContactInfo>();
            //container.RegisterType<IClientInfo, ClientInfo>();

            //container.RegisterType<ISmallCorpSMCorporationID, SmallCorpSMCorporationID>();
            //container.RegisterType<ITravelMoneyUser, TravelMoneyUser>();
            //container.RegisterType<IRead, Read>();
            #endregion

            #endregion

            #region 注册数据组装类

            #endregion

            #region 业务处理

            //container.RegisterType<IBaseDataBiz, BaseDataBiz>();

            container.RegisterType<CreateOrderBiz>().Named<IOrderBiz>("GroupOrder");                    //按照业务线划分,实现多态
            container.RegisterType<CreateOrderBookingBiz>().Named<IOrderBiz>("BookingGroupOrder");

            #endregion

            builder = Container.Build();
        }

        public TService Resolve<TService>()
        {
            return builder.Resolve<TService>();
        }

        public TService Resolve<TService>(string ServiceLine)
        {
            if (builder.IsRegisteredWithName(ServiceLine,typeof(TService)))
            {
                return builder.ResolveNamed<TService>(ServiceLine);
            }
            return default(TService);
        }

        public object Resolve(Type type)
        {
            return builder.Resolve(type);
        }

        public void RegisterType(Type type)
        {
            Container.RegisterType(type);

        }
    }
} 

具体用法如下,解耦如下

IOrderBiz GOBiz = Ioc.IoCFactory.Instance.CurrentContainer.Resolve<IOrderBiz>("GroupOrder");

    O_CreateOrder obj = GOBiz.BulidNewOrder<O_CreateOrder>(resinfo);
时间: 2024-08-18 18:11:31

可扩展的 IOC(1)的相关文章

My.Ioc 代码示例——谈一谈如何实现装饰器 (Decorator) 模式,兼谈如何扩展 My.Ioc

装饰器模式体现了一种“组合优于继承”的思想.当我们要动态为对象增加新功能时,装饰器模式往往是我们的好帮手. 很多后期出现的 Ioc 容器都为装饰器模式提供了支持,比如说 Autofac.在 My.Ioc 中,默认不提供装饰器支持,但我们可以自己进行扩展,以提供此项功能. using System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using My.Ioc; u

浅谈Spring(二)IOC原理

一.引言 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑.举例:如果我们打开机械式手表的后盖,就会发现其是由N个齿轮组成,各个齿轮分别带动时针.分针和秒针顺时针旋转,从而在表盘上产生正确的时间.在这样的齿轮组中,如果有一个齿轮出了问题,就可能会影响到整个齿轮组的正常运转.齿轮组中齿轮之间的啮合关系,与软件系统中对象之间的耦合关系非常相似.对象之间的耦合关系是无法避免的,也是必要的,这是协同工作的基础.现在,伴随着

Spring的IOC原理

1. IoC理论的背景我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们打开机械式手表的后盖,就会看到与上面类似的情形,各个齿轮分别带动时针.分针和秒针顺时针旋转,从而在表盘上产生正确的时间.图1中描述的就是这样的一个齿轮组,它拥有多个独立的齿轮,这些齿轮相互啮合在一起,协同工作,共同完成某项任务.我们可以看到,在这样的齿轮组中,如果有一个齿轮出了问题,就可能会影响到整个齿轮组

深入理解IOC模式及Unity框架

学习IOC发现如下博客写的很清楚了,故Mark下来以便以后查阅和温习! 1.IoC模式:http://www.cnblogs.com/qqlin/archive/2012/10/09/2707075.html  这篇博客是通过一个播放器的例子来说明什么是依赖,依赖倒置,控制反转(IOC),最后实现依赖注入.通过Unity实现IOC容器.不错的一个例子 2.深入理解DIP.IoC.DI以及IoC容器 这个算是最通俗易懂的,手动实现了IOC容器  由浅入深 3.理解依赖注入(IOC)和学习Unity

LCLFramework框架之IOC

LCLFramework框架之依赖注入(IOC)职责 依赖注入(Dependency Injection,简称DI) 依赖查找(Dependency Lookup) 控制反转 LCLFramework框架之依赖注入(IOC)设计 网上有很多的IOC框架如何让用户选择自己熟悉的IOC框架了,那LCL就需要提供可扩展的IOC应该如何让框架注入自己熟悉的IOC框架呢? 下图是基本的IOC扩展契约,所有的第三方都要实现IObjectContainer契约,下图中实现了,Unity,TinyIoc两个第三

对象设计解耦的方法IOC和DI

耦合关系不仅会出现在对象与对象之间,也会出现在软件系统的各模块之间,以及软件系统和硬件系统之间.如何降低系统之间.模块之间和对象之间的耦合度,是软件工程永远追求的目标之一.为了解决对象之间的耦合度过高的问题,软件专家Michael Mattson提出了IOC理论,用来实现对象之间的“解耦”,目前这个理论已经被成功地应用到实践当中,很多的J2EE项目均采用了IOC框架产品Spring. 面向对象的核心思想简单来说就是把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现对外部是透明的,从

Asp.net 面向接口可扩展框架之类型转化基础服务

新框架正在逐步完善,可喜可贺的是基础服务部分初具备模样了,给大家分享一下 由于基础服务涉及太广,也没开发完,这篇只介绍其中的类型转化部分,命名为类型转化基础服务,其实就是基础服务模块的类型转化子模块 说到类型转化必须要清楚.net的类型,类型都不清楚何来类型转化 1.Primitive类型 1.1 这个概念估计很多人都没听说过,Primitive不是一个新类型,而是.net类型中最基本的一种分类,是基元类型的意思       MS将类型分为三类:Primitive(基元类型).Complex(复

控制反转IOC与依赖注入DI

1. IoC理论的背景我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们打开机械式手表的后盖,就会看到与上面类似的情形,各个齿轮分别带动时针.分针和秒针顺时针旋转,从而在表盘上产生正确的时间.图1中描述的就是这样的一个齿轮组,它拥有多个独立的齿轮,这些齿轮相互啮合在一起,协同工作,共同完成某项任务.我们可以看到,在这样的齿轮组中,如果有一个齿轮出了问题,就可能会影响到整个齿轮组

架构师之路(39)---IoC框架

1 IoC理论的背景     我们都知道,在採用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,全部的对象通过彼此的合作,终于实现系统的业务逻辑. 图1:软件系统中耦合的对象 假设我们打开机械式手表的后盖,就会看到与上面类似的情形,各个齿轮分别带动时针.分针和秒针顺时针旋转,从而在表盘上产生正确的时间.图1中描写叙述的就是这种一个齿轮组,它拥有多个独立的齿轮,这些齿轮相互啮合在一起,协同工作,共同完毕某项任务.我们能够看到,在这种齿轮组中,假设有一个齿轮出了问题,就可能会影响到整