zoukankan      html  css  js  c++  java
  • Autofac属性方法注入

    添加Autofac和Autofac.Extensions.DependencyInjection包

    使用autofac替换内部IOC

    .UseServiceProviderFactory(new AutofacServiceProviderFactory());

      public interface ICompanyService 
        {
            public int GetId(int id);
        }
    public interface ISysUserService 
        {
            public int GetId(int id);
        }
     public class CompanyService : ICompanyService
        {
            /// <summary>
            /// 这里是一个属性:如果支持属性注入---CompanyService构造完成以后,要吧这个属性的实例构建出来;
            /// </summary>
            [CustomProperty]
            public ISysUserService _ISysUserService { get; set; }
             
            public ISysUserService _ISysUserServiceNoAttribute { get; set; }
    
            public ISysUserService _ISysUserServiceCtor = null;
            public CompanyService(ISysUserService iSysUserService)
            {
                _ISysUserServiceCtor = iSysUserService;
            }
             
            public ISysUserService _ISysUserServiceMethod = null;
    
            public void SetService(ISysUserService iSysUserService)
            {
                _ISysUserServiceMethod = iSysUserService;
            }
    
    
            public int GetId(int id)
            {
                return id;
            }
        }
    
    public class SysUserService : ISysUserService
        {
            public SysUserService()
            {
                Console.WriteLine($"{GetType().Name}被构造。。。。");
            }
    
            public int GetId(int id)
            {
                return 1;
            }
        }
    
    //添加属性注入时使用的属性
     [AttributeUsage(AttributeTargets.Property)]//为了支持属性注入,只能标记在属性上
        public class CustomPropertyAttribute : Attribute
        {
        }
      /// <summary>
        /// IPropertySelector:查看 属性上是否标记某一个特性
        /// </summary>
        public class CustomPropertySelector : IPropertySelector
        {
            public bool InjectProperty(PropertyInfo propertyInfo, object instance)
            {
                //需要一个判断的维度;  如果标记的有CustomPropertyAttribute特性 返回True:返回true;就构造实例
                return propertyInfo.CustomAttributes.Any(it => it.AttributeType == typeof(CustomPropertyAttribute));
            }
        }
    
    注册服务
       public void ConfigureContainer(ContainerBuilder containerBuilder)
            {
    
                //如果要注册某一个Dll中的服务;可以通过反射把dll加载进来;然后再读取出来抽象和具体;然后逐个注册进去;
    
                //注册服务
                containerBuilder.RegisterType<CompanyService>()
                    .OnActivated(e => e.Instance.SetService(e.Context.Resolve<ISysUserService>())) //方法注入--再获取实例后,把指定的某一个方法给执行以下
                    .As<ICompanyService>()
                    .PropertiesAutowired(new CustomPropertySelector());  //Autoafc自己来调用的这个方法
    
    
                containerBuilder.RegisterType<SysUserService>().As<ISysUserService>();
            }
    View Code
  • 相关阅读:
    linux下RTP编程(使用JRTPLIB)(转)
    omap 移植qt4.7.0
    mknod指令详解
    mplayer 在线播放错误
    移植Mplayer到OK6410开发板
    海量数据处理算法—Bit-Map
    海量数据面试题----分而治之/hash映射 + hash统计 + 堆/快速/归并排序
    并行、并发、同步和互斥
    阿里巴巴集团2014年校园招聘北京笔试题
    动态规划之矩阵连乘
  • 原文地址:https://www.cnblogs.com/Duko/p/14949900.html
Copyright © 2011-2022 走看看