.NET之IOC控制反转运用

当前场景:

如果有不同的用户。使用同一个系统。而不同的客户有某些不同的需求。在不改变系统主体的情况下,可以直接使用IOC控制反转依赖搭建项目

1.添加接口层

目前里面只有一个会员的类。里面有一个登录接口

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

namespace IService
{
    public interface IUser
    {
        void Login();
    }
}

2.添加相应的实现层;

标准版实现层

using IService;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Service.Standard
{
    public class User : IUser
    {
        public void Login()
        {
            Console.Write("标准版登录");
        }
    }
}

定制版实现层

using IService;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Service.Customization
{
    public class User : IUser
    {
        public void Login()
        {
            Console.Write("定制版的登录");
        }
    }
}

3.相应的接口层和实现层都已经完善之后。开始最核心的代码;反转

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace IOCConfig
{
    public class Convert
    {
        /// <summary>
        /// 返回实现类的key名
        /// </summary>
        /// <param name="assembly"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        private static string GetImpementClassKey(Assembly assembly, string key)
        {
            var allTypes = assembly.GetTypes();
            var type = allTypes.FirstOrDefault(t => t.GetInterface(key) != null);
            if (type == null)
            {
                throw new NotImplementedException("未实现" + key);
            }
            return type.FullName;

        }

        /// <summary>
        /// 创建对象实例
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="fullName">命名空间.类型名</param>
        /// <param name="assemblyName">程序集</param>
        /// <returns></returns>
        public static T CreateInstance<T>(string fullName, string assemblyName)
        {
            string path = fullName + "," + assemblyName;//命名空间.类型名,程序集
            Type o = Type.GetType(path);//加载类型
            object obj = Activator.CreateInstance(o, true);//根据类型创建实例
            return (T)obj;//类型转换并返回
        }

        /// <summary>
        /// IOC控制
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="userId">客户ID</param>
        /// <returns></returns>
        public static T IocConvert<T>(int userId = 0) where T : class
        {
            string assemblyName = string.Empty ;//程序集名称
            if (userId==0)
            {
                assemblyName = "Service.Standard";//标准版
            }
            else
            {
                //可以根据不同的客户进行不同的实现层
                assemblyName = "Service.Customization";//定制版
            }
            var baseType = typeof(T).FullName;
            string key = GetImpementClassKey(Assembly.Load(assemblyName), baseType);
            return CreateInstance<T>(key, assemblyName);
        }
    }
}

4.稳定前端代码;

using IService;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace IOC
{
    class Program
    {
        static void Main(string[] args)
        {
            //标准版实现
            IUser user = IOCConfig.Convert.IocConvert<IUser>();
            user.Login();

            Console.Write("\n");

            //定制版实现
            IUser user1 = IOCConfig.Convert.IocConvert<IUser>(1);
            user1.Login();

            //标准定制只需要传相应的用户编号进去,这样前端代码都不会有任何改动.
            Console.Read();

        }
    }
}

注:前端需要引用相应的定制层的bin

时间: 2024-08-08 22:23:23

.NET之IOC控制反转运用的相关文章

谈谈php里的IOC控制反转,DI依赖注入

理论 发现问题 在深入细节之前,需要确保我们理解"IOC控制反转"和"DI依赖注入"是什么,能够解决什么问题,这些在维基百科中有非常清晰的说明. 控制反转(Inversion of Control,缩写为IoC):是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度. 依赖注入(Dependency Injection,简称DI):DI是IOC的一种实现,表现为:在类A的实例创建过程中即创建了依赖的B对象,通过类型或名称来判断将不同的对象注入到不同的属

IOC控制反转

控制反转: 把对象的创建交给spring容器来做 spring容器创建对象的方式 1.默认是调用默认的构造函数 2.利用静态工厂方法创建 spring调用工厂方法产生对象,但是真正创建对象还是由程序员来完成的 3.实例工厂方法 说明: spring配置文件中,只要是一个bean就会为该bean创建对象 spring容器创建对象的时机 在单例的情况下 1.在默认的情况下,启动spring容器创建对象 2.在spring的配置文件bean中有一个属性lazy-init="default/true/f

谈谈php里的IOC控制反转,DI依赖注入(转)

转自:http://www.cnblogs.com/qq120848369/p/6129483.html 发现问题 在深入细节之前,需要确保我们理解"IOC控制反转"和"DI依赖注入"是什么,能够解决什么问题,这些在维基百科中有非常清晰的说明. 控制反转(Inversion of Control,缩写为IoC):是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度. 依赖注入(Dependency Injection,简称DI):DI是IOC的一种实现

Spring学习之Ioc控制反转(1)

开始之前: 1. 本博文为原创,转载请注明出处 2. 作者非计算机科班出身,如有错误,请多指正 ---------------------------------------------------------------------------开始啦啦啦啦啦------------------------------------------------------------------------------- 从开始接触spring起,听到最多的就是Ioc(控制反转)和AOP(面向切面编程

IoC实践--用Autofac实现MVC5.0的IoC控制反转方法

Autofac是一个.net平台下发性能还不错的IoC框架,利用它可以实现依赖注入和控制反转,使自己的软件模块之间的耦合性大大降低,让软件扩展.维护更加容易.控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题.下面我就用Autofac实现ASP.NET mvc5.0的IOC控制反转的方法.这里用到是vs2013,Autofac ASP.NET MVC 5 Integration和mvc 5.0.Autofac ASP.N

Spring学习之Ioc控制反转(2)

开始之前: 1. 本博文为原创,转载请注明出处 2. 作者非计算机科班出身,如有错误,请多指正 ---------------------------------------------------------------------------开始啦啦啦啦啦------------------------------------------------------------------------------- 上一篇博文简单的演示了如何用Spring框架创建bean,注入bean,并使用到

Spring详解(二)------IOC控制反转

我相信提到 Spring,很多人会脱口而出IOC(控制反转).DI(依赖注入).AOP等等概念,这些概念也是面试官经常问到的知识点.那么这篇博客我们就来详细的讲解 IOC控制反转. ps:本篇博客源码下载链接:http://pan.baidu.com/s/1miwZIf2 密码:oquc 1.什么是 IOC? IOC-Inversion of Control,即控制反转.它不是什么技术,而是一种设计思想. 传统的创建对象的方法是直接通过 new 关键字,而 spring 则是通过 IOC 容器来

【框架】[Spring3]下载安装、开源框架与IoC控制反转详解

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] 昨天刚刚初学Spring3,也许Spring3有点老了哈,不过还是先把3学了再去学习4吧,首先先介绍一下如何去下载Spring的必须包吧. (本篇博客适用于初学Spring的朋友) java spring4现在不推荐使用xml配置文件- 当然啦,这些知识点在Spring4还是可以用的. 不过我在这里详解的还是Spring3哈,见谅~ 下载SpringJAR包/文档: Spring官

spring IOC控制反转 DI注入

<!-- 初始化 init-method="init" 销毁destroy-method="destory" --> <!--懒加载 lazy-init="true" --> <bean id="IUDao" class="dao.IUDao" scope="singleton" init-method="init" destroy-me