IOC

简介:

IOC(控制反转)模式 是设计模式的一种

主要的目的用来解除一个类对另一个具体类的依赖.使其不受需求变化的影响, 同时兼顾所有相同类型的对象.

 

一个明确直接引用某个对象的形式:

假设变动需求, 则需要改动调用者. 频繁改动会增加维护负担:

实际上, 调用者都是需要 被调用这(A or B)完成一种相似的功能.

这里可以引入一层抽象层, 也就是接口来做一个约定

这样调用者就知道自己该调用哪种对象(即符合IClass接口约定的对象).

但是此时调用者并未完成解耦, 控制权依然在调用者.

所以这时需要创建一个第三方管理者来帮助调用者管理调用的行为

这里的 var i = Fac.GetClass(); 可以是个静态工厂 也可以是专门实例化一个管理类.

总之是将实例化A,B两个类的权利交给第三方(这里也就是Fac)来做.

这样需求变更的时候只需要变动Fac即可.

这样做虽然代码量上没有减少(反而更多) 但是,目的是为了减少每个类之间的直接关联, 做好自己本分的事情

{

原来的调用者拥有选择调用哪个类以及使用这个类执行方法 两种职能, 

这不符合一个方法只做一件事的原则, 

所以它将判断调用哪个类的职能交给第三者, 

由一个专门的类来管理.自己只用专心使用第三者传回来的类执行某个方法就可以.

就好像你家有10辆车, 每天需要开车 又要亲自挑选开哪辆车.

控制反转只是创建了一个管家, 由他每天帮你决定开哪辆车,

你只管接手他给你的车去开, 再也不用去管自己开的是哪辆车(只要是车能开就行).

}

这里有一个稍微智能点的方案.

这里的 Fac 根据调用者不同的需求可以扩展(不需要修改)不同的方案(即你某一天又想自己获得控制权, 叫管家帮你准备某辆具体的车).

至此, IOC 的功能就介绍完毕.

 

当某个调用者只需要完成某一个方法时,而不用去管执行这个方法的来源时, 就可以使用IOC的模式. 将控制权交出由第三方来判断需要使用哪个具体对象.

 

 

在 mvc 里要用的话 

首先需要自己定义一个 空的 IDenpaney

然后在 Global 里写

  void Application_Start(object sender, EventArgs e)
        {
            var builder = new ContainerBuilder();
            var baseType = typeof(IDependency);
            var assemblys = AppDomain.CurrentDomain.GetAssemblies().ToList();
            var AllServices = assemblys
                .SelectMany(s => s.GetTypes())
                .Where(p => baseType.IsAssignableFrom(p) && p != baseType);

            builder.RegisterControllers(assemblys.ToArray());
            //builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
            builder.RegisterAssemblyTypes(assemblys.ToArray())
                .Where(t => baseType.IsAssignableFrom(t) && t != baseType)
                .AsImplementedInterfaces()
                .InstancePerLifetimeScope();

            var container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));


            //ContainerBuilder builder = new ContainerBuilder();
            //builder.RegisterGeneric(typeof(Repository<,>)).As(typeof(IRepository<,>));
            //Type baseType = typeof(IDependency);
            //// 获取所有相关类库的程序集
            //Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies().ToArray();
            //builder.RegisterAssemblyTypes(assemblies)
            //    .Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract)
            //    .AsImplementedInterfaces().InstancePerLifetimeScope();//InstancePerLifetimeScope 保证对象生命周期基于请求
            //IContainer container = builder.Build();
            //DependencyResolver.SetResolver(new AutofacDependencyResolver(container));


            //var builder = new ContainerBuilder();
            //builder.RegisterType<StudentAppService>().AsImplementedInterfaces();
            //builder.RegisterType<StudentController>();
            //IContainer container = builder.Build();
            //DependencyResolver.SetResolver(new AutofacDependencyResolver(container));


            // Code that runs on application startup
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
        }

 

posted @ 2015-09-13 09:24  `Laimic  阅读(207)  评论(0)    收藏  举报