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); }