• Autofac在.NetCore 下的使用


    在工作开发中很多地方都会使用到接口模式开发,这里就会用到依赖注入,.NetCore目前是自带的 ,在 Startup.cs中的 ConfigureServices方法中增加 本篇文章仅支持 3.0版本以下core

     1    public void ConfigureServices(IServiceCollection services)
     2         {
     3             services.AddMemoryCache();
     4             services.AddMvc().AddWebApiConventions();
     5             services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
     6             services.Configure<ApiBehaviorOptions>(options =>
     7             {
     8                 options.SuppressConsumesConstraintForFormFileParameters = true;
     9                 options.SuppressInferBindingSourcesForParameters = true;
    10                 options.SuppressModelStateInvalidFilter = true;
    11             });
    12             services.AddMvc().AddJsonOptions(options => { options.SerializerSettings.ContractResolver = new DefaultContractResolver(); });//返回值小写处理
    13             services.AddMvc(option => { option.Filters.Add(typeof(SecurityAuthorizeAttribute)); });//添加过滤器
    14             services.AddMvc(option => { option.Filters.Add(typeof(GlobalHandlerErrorAttribute)); });//添加过滤器
    15             services.AddSingleton<CacheHelper>();
    16             services.AddSingleton<IQRCode, RaffQRCode>();
    17             services.AddHttpContextAccessor();
    18             services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();
    19         }

    这样明显不够方便 Autofac就解决了这一问题,那么下面就看看Autofac在.NetCore中是如何使用的:

         1、首先建立简单的一个基于接口模式的项目.NteCore Mvc模式 引用  Autofac.Extensions.DependencyInjection的引用

         

        2、在 IRepository、IServices、Repository、Services中增加相关代码 所有接口继承自IDependency

       //IRepository
     public interface IBaseRepository<T> : IDependency where T : BaseEntity
        {
    
            string GetUserName();
        }
    
    //Repository
      public class BaseRepository<T> : IBaseRepository<T> ,IDependency where T : BaseEntity
        {
            public string GetUserName()
            {
                return "just0ne";
            }
        }
    //IServices
      public interface IBaseServices<T> : IDependency where T : BaseEntity
        {
    
            string GetUserName();
        }
    //Services
     public class BaseServices<T> : IBaseServices<T> , IDependency where T : BaseEntity
        {
            public readonly IBaseRepository<T> _baseRepository;
    
            public BaseServices(IBaseRepository<T> baseRepository)
            {
                _baseRepository = baseRepository;
            }
    
            /// <summary>
            /// 获取一个用户名
            /// </summary>
            /// <returns></returns>
            public string GetUserName()
            {
                return _baseRepository.GetUserName();
            }
        }

        3、Aufofac的加入,这边需要在项目启动Startup中调整 ConfigureServices方法。具体如下

        

     public IServiceProvider ConfigureServices(IServiceCollection services) 
            {
                services.Configure<CookiePolicyOptions>(options =>
                {
                    // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                    options.CheckConsentNeeded = context => true;
                    options.MinimumSameSitePolicy = SameSiteMode.None;
                });
    
                services.AddMvc();
                var builder = new ContainerBuilder();//实例化 AutoFac  容器   
                var assemblys = new List<Assembly>();//Service是继承接口的实现方法类库名称
                string assemblysStr = "IRepository^IServices^Repository^Services"; //程序集名称
                foreach (var item in assemblysStr.Split("^"))
                {
                    assemblys.Add(Assembly.Load(item));
                }
                var baseType = typeof(IDependency);//IDependency 是一个接口(所有要实现依赖注入的借口都要继承该接口)
                builder.RegisterAssemblyTypes(assemblys.ToArray())
               .Where(m => baseType.IsAssignableFrom(m) && m != baseType)
               .AsImplementedInterfaces().InstancePerLifetimeScope();
                builder.Populate(services);
                return new AutofacServiceProvider(builder.Build());//将系统自带的修改为Atuofac的 重新返回
    
            }

               控制器层的调用

       

     调用结果:

                 

               ok 到此完美结束!

  • 相关阅读:
    什么变量在堆内存里存放,什么变量在栈内存里存放
    iOS应用开发:什么是ARC?
    Stack栈 Heap堆
    iOS中四种实例变量的范围类型@private@protected@public@package
    [转载] iOS应用程序的生命周期
    总结iOS 8和Xcode 6的各种坑
    [转载]对iOS开发中内存管理的一点总结与理解
    企业账号申请以及打包上传
    更换AppleWWDRCA.cer证书
    iOS9适配
  • 原文地址:https://www.cnblogs.com/just0ne/p/11587683.html
Copyright © 2020-2023  润新知