您的位置:首页 > 编程语言 > C#

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

2016-11-07 11:53 676 查看
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()方法即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ioc .net