• C#设计模式之控制反转即依赖注入-Spring.NET


    主流的依赖注入方案:微软企业库中的Unity、Spring.NET、StructureMap、Ninject、Castle Windsor等等。

    本章用简单的案例讲解 Spring.NET IOC-控制反转即依赖注入:

    实例:使用Spring.NET IOC方式,解决复杂的数据访问,

    如:

    用户A需要使用ADO.NET实现数据访问层代码;

    用户B需要使用EF实现数据访问层代码;

    遇到此种情况,如果不借助控制反转,使用普通的方式解决的话,则每个用户都需要修改后台代码(违反了OOP中的开闭原则),才能实现不同用户调用不同数据访问层的问题

    1、先创建一个控制台程序项目。

    2、添加IUserInfoDal 接口。

    复制代码
    namespace Spring.Net
    {
        public interface IUserInfoDal
        {
            void Show();
        }
    }
    复制代码

    3、添加Ado_NetUserInfoDal类和EFUserInfoDal类,继承IUserInfoDal接口。

    ADO_NetUserInfoDal.cs
    复制代码
    public class ADO_NetUserInfoDal:IUserInfoDal
        {
            public void Show()
            {
                Console.WriteLine("我是 AdoNet Dal" );
            }
        }
    复制代码

    EF_UserInfoDal.cs

    复制代码
    public class EF_UserInfoDal: IUserInfoDal
        {
            public void Show()
            {
                Console.WriteLine("我是EF Dal");
            }     
        }
    复制代码

    4、引用Spring.Net程序集 Spring.Core.dll 和 Common.Logging.dll

    5、添加Spring.Net配置节点,配置object节点

    复制代码
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <!--一定要在紧跟着configuration下面添加-->
      <configSections>
        <!--跟下面Spring.Net节点配置是一一对应关系-->
        <sectionGroup name="spring">
          <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
          <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
        </sectionGroup>
      </configSections>
      
        <startup> 
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
        </startup>
    
      <!--Spring.Net节点配置-->
      <spring>
        <context>
          <!--容器配置-->
          <resource uri="config://spring/objects"/>
        </context>
        <objects xmlns="http://www.springframework.net">
          <!--name 必须要唯一的,type=类的全名称,所在的程序集-->
          <object name="UserInfoDal" type="Spring.Net.EF_UserInfoDal, Spring.Net">
          </object>      
      </spring>
    </configuration>
    复制代码

    6、主函数,创建spring容器上下文

    复制代码
    namespace Spring.Net
    {
        class Program
        {
            static void Main(string[] args)
            {
                //控制权没有反转
                //IUserInfoDal infoDal = new EFUserInfoDal();
             //IUserInfoDal infoDal = new ADO_NetUserInfoDal();

    //Spring.Net 创建实例的方式转为容器帮我们创建
           //创建spring容器上下文 
           IApplicationContext ctx = ContextRegistry.GetContext();
          //通过容器创建对象
          IUserInfoDal efDal = ctx.GetObject("UserInfoDal") as IUserInfoDal;

          efDal.Show();
          Console.ReadKey();
         }
        }
       }

    输出:
        我是EF Dal

    注:
    如果在app.config 配置文件中
    <object name="UserInfoDal" type="Spring.Net.EF_UserInfoDal, Spring.Net">
    将 EF_UserInfoDal 改为 ADO_NetUserInfoDal 则
    输出:
        我是 AdoNet Dal

    类似于抽象工场(使用反射机制,在配置文件中配置)
    
    
  • 相关阅读:
    JAVA基础--函数和数组03
    JAVA基础--流程控制语句02
    xampp环境下,配置Zend Studio调试php(XDebug) 转摘:http://www.cnblogs.com/tuyithief/archive/2011/06/02/2068431.html
    mysql修改root密码和设置权限 转摘:http://www.cnblogs.com/wangs/p/3346767.html
    mysql 备份还原
    Git忽略已经跟踪的文件 转摘:http://blog.csdn.net/huguohuan/article/details/7380349
    adb]ADB server didn't ACK
    java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation getting while running test project?
    Debug your ASP.NET Application while Hosted on IIS
    wireshark 识别http的标准
  • 原文地址:https://www.cnblogs.com/wang726zq/p/6850889.html
Copyright © 2020-2023  润新知