标签:dom gis 隔离 alc ati void lob 关系 self
Autofac是.NET世界中的IOC容器,据说是效率最高的IOC。
使用IOC的优点大家很清楚,不太懂的请移步百度。由于我的博客最主要的目的之一是为了给自己看,以便以后使用,所以里面例子会多一点,讲解很少,有些我理解的就一笔带过了。
因为我学习Autofac,在网上检索时,大部分人做例子总会先说Interface解耦,然后才引出IOC。我只想说IOC跟Interface貌似没多大关系。IOC只是将对象的控制权进行翻转,由原来的主动获取,变为由IOC注入,跟Interface有什么关系…这样写便有点误导人了,好像觉得,使用IOC不用Interface跟不对似得。实际上作为我来说,我使用IOC的目的很单纯,就是统一管理,加大程序的灵活性和可维护性。其他都是扯淡。理想的解耦固然好,但是不能过度追求解耦。甚至有些对对象的生成效率有要求的程序还要考虑是否使用IOC呢,因为IOC对对象的生成效率是有一定的影响的。 无论是我以前在学习JAVA还是现如今的.NET。对Interface的使用并不是很广泛。也并没有什么太大影响。当然是以我目前接触的项目来看。按照Interface设计理念是可以很好地解耦的,但是我觉得在某种程度上,如果项目不改动不大,若盲目的使用Interface也是一种病态的追求心里。只能说取舍着使用。对于经常变动的部分使用Interface进行隔离,但是也并非是每个service、每个manager都需要一个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()方法即可。
标签:dom gis 隔离 alc ati void lob 关系 self
原文地址:https://www.cnblogs.com/dennyw/p/14229326.html