1、添加autofac相关程序集/使用Nuget
2、引入命名空间
using Autofac; using Autofac.Configuration;
3、使用
3.1:直接使用
var build = new ContainerBuilder();
build.RegisterType<MemoryCacheManager>(); build.Register<ICacheManager>(c => new MemoryCacheManager()).InstancePerLifetimeScope();
//builder.RegisterType<FileLogger>();
//builder.RegisterType<FileLogger>().As<ILogger>();
using (var container = build.Build()) { ICacheManager cache = container.Resolve<ICacheManager>(); //使用 }
3.2:配置文件使用
//1.在配置文件中配置如下代码 依瓢画葫芦即可
EnterpriseFrame.IService 接口类库
EnterpriseFrame.IService.IAdminService 要注册的接口
EnterpriseFrame.Service 实现接口的命名空间
EnterpriseFrame.Service.AdminService 实现的接口
<configuration>
<configSections> <section name="autofac" type="Autofac.Configuration.SectionHandler, Autofac.Configuration"/> </configSections> <autofac defaultAssembly="EnterpriseFrame.IService"> <components> <component type="EnterpriseFrame.Service.AdminService, EnterpriseFrame.Service" service="EnterpriseFrame.IService.IAdminService" /> </components> </autofac> </configuration>
//2.使用
var build = new ContainerBuilder(); build.RegisterModule(new ConfigurationSettingsReader("autofac")); using (var container = build.Build()) { var service = container.Resolve<IAdminService>(); var result = service.CheckAdminPwd("admin", "123456"); Assert.IsTrue(result); }
3.3在mvc的controller使用构造函数的方式注册
//在Application_Start()中调用
var builder = new ContainerBuilder();
AutofacRegisterController(builder);//注册Controller的构造函数
AutofacRegisterService(builder);//注册使用到的服务
private void AutofacRegisterController(ContainerBuilder builder) { var baseType = typeof(IDependency); //var assemblys = AppDomain.CurrentDomain.GetAssemblies().ToList(); var assemblys = System.Web.Compilation.BuildManager.GetReferencedAssemblies().Cast<Assembly>().ToList(); var AllServices = assemblys .SelectMany(s => s.GetTypes()) .Where(p => baseType.IsAssignableFrom(p) && p != baseType); builder.RegisterControllers(assemblys.ToArray()); builder.RegisterAssemblyTypes(assemblys.ToArray()) .Where(t => baseType.IsAssignableFrom(t) && t != baseType) .AsImplementedInterfaces().InstancePerLifetimeScope(); }
private void AutofacRegisterService(ContainerBuilder builder)
{
builder.RegisterGeneric(typeof(EfRepository<>)).As(typeof(IRepository<>)).InstancePerLifetimeScope();
builder.Register<IDbContext>(c => new EnterpriseContext("name=EnterpriseCon")).InstancePerLifetimeScope();//连接字符串
builder.Register<ILogger>(c => new MyLogger(HttpContext.Current.Server.MapPath(""))).InstancePerLifetimeScope();//注册日志 保存至根目录
builder.Register<ICacheManager>(c => new MemoryCacheManager()).InstancePerLifetimeScope();//注册缓存
}
控制器代码:
public class TestController : Controller { private ILogger _logger; private ICacheManager _cacheManager; public TestController(ILogger logger,ICacheManager cache) { _logger = logger; _cacheManager = cache; } private static string TEST_CACHE_KEY = "TEST_CACHE_KEY"; public ActionResult Caching() { string time = _cacheManager.Get<string>(TEST_CACHE_KEY, 1, () => { return DateTime.Now.ToString(); }); return Content(time); } }
Global.asax Application_Start方法中可以这样写:
//方式二 //var builder = new ContainerBuilder(); //builder.RegisterType<FileLogger>(); //builder.Register<ILogger>(c => new FileLogger()).InstancePerLifetimeScope(); //var assembly = Assembly.GetExecutingAssembly(); //builder.RegisterControllers(assembly).PropertiesAutowired();//PropertiesAutowired();属性注入 //var container = builder.Build(); //DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
文中若有错误和不足之处,还望路过的道友指出。