zoukankan      html  css  js  c++  java
  • autofac

    /*
      User: Peter
      Date: 2015/8/10
      Time: 19:54
     
                               
    */   
    using System;
    using System.Linq;
    using System.Collections;
    using System.Collections.Generic;
    using Autofac.Extras.Attributed;
    using Autofac.Features.Metadata;
    using System.ComponentModel.Composition;
    using System.Reflection;
    using System.ComponentModel;
    using Autofac;
    
    
    namespace testAutofac
    {
        
        class Testdict:Dictionary<string,object>
        {
            public Testdict(string name)
            {
                this["name"] = name;
            }
        }
        [MetadataAttribute]
        class LetterFormatterAttribute : Attribute
        {
            public string Name { get; private set; }
            public int Age { get; private set; }
         
            public LetterFormatterAttribute(IDictionary<string, object> dict)
            {
                Name = dict["Name"].ToString();
                
                Age =int.Parse(dict["Age"].ToString());
                
            }
         
            public LetterFormatterAttribute(string name,int Age)
            {
                Name = name;
                this.Age = Age;
            }
         
        }
    
        interface ILetterFormatter
        {
            string FormatLetter(string content);
        }
        
        
        [LetterFormatter("Personal2",20)]
        class ImpersonalLetterFormatter : ILetterFormatter
        {
            public ImpersonalLetterFormatter()
            {
                Console.WriteLine("ImpersonalLetterFormatter");
            }
            public string FormatLetter(string content)
            {
                return "To Whom It May Concern:nn" + content;
            }
        }
    
        [LetterFormatter("Personal",10)]
        class PersonalLetterFormatter : ILetterFormatter
        {
            public PersonalLetterFormatter()
            {
                Console.WriteLine("PersonalLetterFormatter");
            }
            public string FormatLetter(string content)
            {
                return "Dear Individual,nn" + content;
            }
            
            
        }
        
        interface ITop
        {
             string   FormatLetter(string name ,string content);
        }
    
         class Top:ITop
        {
            IEnumerable<Meta<Lazy<ILetterFormatter>, LetterFormatterAttribute>> _letters;
            public Top(IEnumerable<Meta<Lazy<ILetterFormatter>, LetterFormatterAttribute>> 
                       letters)
            {
                _letters = letters;
            }
            public string   FormatLetter(string name ,string content)
            {
                var letterPersonal = _letters.First(
                    x=>
                    {
                        Console.WriteLine(x.Metadata.Age);
                        return x.Metadata.Name==name ;
                        
                    }
                );
                return letterPersonal.Value.Value.FormatLetter(content);
            }
        }
    
    
        class Program
        {
            public static void Main(string[] args)
            {
                 var builder = new ContainerBuilder();
     
                builder.RegisterModule<AttributedMetadataModule>();
     
                builder.RegisterAssemblyTypes(typeof(Program).Assembly)
            
                    .AsImplementedInterfaces();
                
                
                var container = builder.Build();
                var top
                    = container.Resolve<ITop>();
                
                Console.WriteLine(top.FormatLetter("Personal2","aaa"));
                Console.ReadKey(true);
            }
        }
    }

    主要测试autofac 的注入

    IEnumerable<Meta<Lazy<ILetterFormatter>, LetterFormatterAttribute>>

    一个接口实现多类,用Attribute来判断那个可以使用。

      <package id="Autofac" version="3.1.0" targetFramework="net40" />
      <package id="Autofac.Extras.Attributed" version="3.1.0" targetFramework="net40" />

    Attribute类一定要有一个构造有参数IDictionary<string, object>, autofac通过这个反射入值。

  • 相关阅读:
    【官网翻译】性能篇(四)为电池寿命做优化——使用Battery Historian分析电源使用情况
    【官网翻译】性能篇(三)为电池寿命做优化——概述
    【官网翻译】性能篇(二)通过线程提高性能
    Mybatis+Struts2的结合:实现用户插入和查找
    在安装mysql出现的错误以及解决方法
    关于PHP的内置服务器的使用
    误用.Net Redis客户端CSRedisCore,自己挖坑自己填
    dotnet代码管理之密钥分离策略
    dotnetcore三大Redis客户端对比和使用心得
    生产环境(基于docker)故障排除? 有感于博客园三番五次翻车
  • 原文地址:https://www.cnblogs.com/peteryu007/p/4727847.html
Copyright © 2011-2022 走看看