1.安装Autofac包和Autofac.Integration.Mvc包,在global中进行注入:
var builder = new ContainerBuilder();
//注册所有Controller
builder.RegisterControllers(Assembly.GetExecutingAssembly());
//所有引用的程序集
var referencesAseemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>();
builder.RegisterAssemblyTypes(referencesAseemblies.ToArray())
.Where(t => t.Name.EndsWith("AppService") && !t.IsAbstract )
.AsImplementedInterfaces()
.InstancePerLifetimeScope();
builder.RegisterGeneric(typeof(ServiceBase<>))
.As(typeof(IServiceBase<>))
.AsImplementedInterfaces()
.InstancePerLifetimeScope(); //保证对象声明周期基于请求
var container = builder.Build(); //Build方法创建一个容器
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); //注册MVC容器
2.在Controller构造函数进行注入测试:
public class HomeController : Controller
{
private readonly IServiceBase<Role> _roleService;
private readonly IProductAppService _productService;
public HomeController(IServiceBase<Role> roleService, IProductAppService productService)
{
_roleService = roleService;
_productService = productService;
}
public ActionResult Index()
{
string str = _productService.Show();
var list = _roleService.Query(new PagingParam()).ToList();
return View();
}
3.WebApi注入,和Controller不太一样,需要引用Autofac、Autofac ASP.NET WebApi2、Asp.Net WebApi.WebHost
IocBuilder.RegisterApiControllers(startupModule.ControllerAseembly);
IocBuilder.RegisterAssemblyTypes(startupModule._StartupAssemblies.ToArray())
.Where(t => t.Name.EndsWith("AppService") && !t.IsAbstract)
.AsImplementedInterfaces()
.InstancePerLifetimeScope();
IocBuilder.RegisterGeneric(typeof(BaseAppService<>))
.As(typeof(IBaseAppService<>))
.AsImplementedInterfaces()
.InstancePerLifetimeScope();
var container = IocBuilder.Build();
var resolver = new AutofacWebApiDependencyResolver(container);
GlobalConfiguration.Configuration.DependencyResolver = resolver;
然后就可以再apiController进行构造函数注入了,用法和MVC一样。
Autofac注入,实现类注入到接口,使用的时候,接口的实例就是注入的类型,
如Log4注入:
bootStrapper.IocBuilder.Register(t => log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType))
.As<ILog>().AsImplementedInterfaces().InstancePerLifetimeScope();