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);//注册使用到的服务
 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));

 

文中若有错误和不足之处,还望路过的道友指出。

相关文章:

  • 2022-12-23
  • 2021-12-18
  • 2022-12-23
  • 2022-01-17
  • 2021-11-14
  • 2021-12-02
  • 2022-01-21
  • 2021-06-29
猜你喜欢
  • 2021-08-09
  • 2021-12-24
  • 2021-04-25
  • 2021-07-13
  • 2021-10-03
  • 2021-12-31
  • 2021-11-29
相关资源
相似解决方案