zoukankan      html  css  js  c++  java
  • 个人项目框架搭建 -- Autofac简单使用记录

    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));

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

  • 相关阅读:
    Linux与Windows命令的比较
    操作系统的启动过程
    Spyder快捷键
    pytoch的最佳打开方式
    操作系统逻辑结构
    插值法
    bzoj3509[CodeChef]COUNTARI
    bzoj2969 矩形粉刷
    hdu5575 Discover Water Tank
    bzoj3473字符串&bzoj3277串
  • 原文地址:https://www.cnblogs.com/morang/p/5371590.html
Copyright © 2011-2022 走看看