【C#MVC】.NET中的IOC--Autofac简单使用

Autofac是.NET世界中的IOC容器,据说是效率最高的IOC。
使用IOC的优点大家很清楚,不太懂的请移步百度。由于我的博客最主要的目的之一是为了给自己看,以便以后使用,所以里面例子会多一点,讲解很少,有些我理解的就一笔带过了。

因为我学习Autofac,在网上检索时,大部分人做例子总会先说Interface解耦,然后才引出IOC。我只想说IOC跟Interface貌似没多大关系。IOC只是将对象的控制权进行翻转,由原来的主动获取,变为由IOC注入,跟Interface有什么关系…这样写便有点误导人了,好像觉得,使用IOC不用Interface跟不对似得。实际上作为我来说,我使用IOC的目的很单纯,就是统一管理,加大程序的灵活性和可维护性。其他都是扯淡。理想的解耦固然好,但是不能过度追求解耦。甚至有些对对象的生成效率有要求的程序还要考虑是否使用IOC呢,因为IOC对对象的生成效率是有一定的影响的。
在这之前先记录一下,对Interface使用的一点理解。当然是以我目前的水准的理解。是对当前的一点记录。若有不对,请指正。
无论是我以前在学习JAVA还是现如今的.NET。对Interface的使用并不是很广泛。也并没有什么太大影响。当然是以我目前接触的项目来看。按照Interface设计理念是可以很好地解耦的,但是我觉得在某种程度上,如果项目不改动不大,若盲目的使用Interface也是一种病态的追求心里。只能说取舍着使用。对于经常变动的部分使用Interface进行隔离,但是也并非是每个service、每个manager都需要一个Interface去对应,这样灵活性反而更差。
上面也说了很多,目的之一就是让自己以后明白,使用IOC跟是否使用Interface没有半毛钱关系,反转的是对象的控制权,Interface是对象,非Interface也是对象。
引入Autofac.dll,Autofac.Configuration.dll。
1.在Global.asax文件中添加:

  protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            var builder = RegisterAll();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(builder.Build()));
            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }

        public ContainerBuilder RegisterAll()
        {
            var builder = new ContainerBuilder();
            Assembly[] assemblies = Directory.GetFiles(AppDomain.CurrentDomain.RelativeSearchPath, "*.dll").Select(Assembly.LoadFrom).ToArray();
            Type baseType = typeof(IDependency);
            builder.RegisterAssemblyTypes(assemblies)
            .Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract)
            .AsSelf().AsImplementedInterfaces()
            .PropertiesAutowired().InstancePerLifetimeScope();
            builder.RegisterControllers(assemblies).PropertiesAutowired();
            return builder;
        }

扫描所有dll,然后为实现IDependency接口的类,进行IOC注册,当然还有其他注册方式,我觉得这是一种简单的注册方式。

2.注入方式:
默认支持构造函数注入。
属性注入需要在注册组件是加入PropertiesAutowired()方法即可。

你可能感兴趣的:(C#MVC)