autofac 初识体会

来源:互联网 发布:淘宝开放平台 编辑:程序博客网 时间:2024/06/05 12:42

        在使用autofac去创建类的实例时,首先第一步就是要注册这个类。例如:现在有一个类的名字叫Class1,那么注册代码如下:

builder.RegisterType<Class1>();

        如果仅仅像上边代码的抒写方式,那么程序在运行的时候就会报错,因为不知道这个类是以什么样的方式呈现,所以还叫加上.AsSelf()或者是.AsImplementedInterfaces()。那么这两种方式有什么区别呢,接下来我以两个例子来进行描述。

如果现在有一个类,该类的名字叫Class2,切该类没有继承于接口。那么此时,该类的注册方式,应该使用AsSelf(),写法如下:

builder.RegisterType<Class2>().AsSelf();

此时,就可以通过如下代码,去获取Class2这个类的一个新实例,如下:

Class2 ClassEntity = container.Resolve<Class2>();

        从上面的例子可以看出AsSelf的注册方式指的是注册为自身的服务。如果此时,将AsSelf变更为AsImplementedInterfaces(),在获取新实例的时候就会报错,因为AsImplementedInterfaces()指的是以接口的形式注册服务,也就是说,通过这种方式注册,那么被注册的类必须要继承于至少一个接口。除此之外,以接口的方式注册,还可以指明具体是以哪种接口实现,代码如下:

builder.RegisterType<Class3>().As<IClass3>();

        在上面的代码中IClass3是一个接口,Class3这个类继承于这个接口。说到这里,可能通过以上的简单描述,对这个两种注册方式有了一个大概的了解,为了避免程序报错,在实际的项目开发中可以将两种注册方式都添加上,这样的话,不管类有没有继承于接口,程序都不会报错,而且它们之前没有冲突和影响,示例代码如下:

builder.RegisterType<Class3>().AsSelf().AsImplementedInterfaces();

    另外,autofac还提供了一种依赖注入的方法实现类的新实例的创建,这种方法就是在某一个类中增加一个该类的构造函数,函数中的参数,就是要创建的类的新实例的服务引用,是以接口或者是类的类型直接呈现。但是有一个前提是,提供构造函数的这个类以及想要通过依赖注入的方式创建的类的新实例必须要预先注册,否则程序就会报错。在使用依赖注入的方式创建类的新实例的时候,还有一部分需要注意。比如,如果是在MVC中使用依赖注入,那么我们就要添加Autofac.Integration.Mvc;这个引用,然后在程序中加上如下代码:DependencyResolver.SetResolver(newAutofacDependencyResolver(container));如果是在WebApi中使用,那么就需要添加using Autofac.Integration.WebApi;这个引用,然后在程序中添加如下代码:DependencyResolver.SetResolver(newAutofacWebApiDependencyResolver(Container));如果不添加上边的代码,那么程序在运行的时候就会报找不到构造函数的异常,这点需要注意。至于这两个引用的dll从哪里获取,我在测试的时候是通过vs中的NuGet程序包管理器中直接搜索Autofac,然后安装,vs会自动将该dll添加到我们制定的项目Bin目录中。

最后要指出的是如何实现一次性注册当前运行的整个程序集的方法,如下:

builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).AsSelf().AsImplementedInterfaces() ;

    上面的代码注册的是当前运行的项目中的所有程序集,如果在整个项目中还有其他的,比如类库,那么如果有需要的话,还需要将需要的类库进行单独注册。

0 0
原创粉丝点击