• AutoFac文档11(转载)


    目录

    1. 开始
    2. Registering components
    3. 控制范围和生命周期
    4. 用模块结构化Autofac
    5. xml配置
    6. 与.net集成
    7. 深入理解Autofac
    8. 指导
    9. 关于
    10. 词汇表

    元数据

    Autofac提供机制去创建和使用component的元数据

    如果你熟悉Managed Extensibility Framework (MEF) ,你很可能已经见过component元数据的例子。

    元数据是存储component中的关于这个component的信息,不需要创建实例也能访问。

    在注册的时候添加元数据

    值描述的元数据在注册阶段和component联系起来,每个元数据都是一个键值对:

    1
    2
    3
    builder.Register(c => new ScreenAppender())
    .As<ILogAppender>()
     .WithMetadata("AppenderName", "screen");

    用XML文件可以表示为

    1
    2
    3
    4
    5
    6
    7
    <component
        type="MyApp.Components.Logging.ScreenAppender, MyApp"
        service="MyApp.Services.Logging.ILogAppender, MyApp" >
        <metadata>
            <item name="AppenderName" value="screen" type="System.String" />
         </metadata>
    </component>

    使用元数据

    不用于一般的属性,元数据和component本身是相互独立额度。

    这使得在运行条件下从很多component中选择一个时非常有用,或者元数据不是component实例的固有属性时。元数据可以表述ITask 执行的时间或者实现了ICommand的按钮标题。

    另外一些component可以使用通过Meta 使用元数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public class Log
    {
        readonly IEnumerable<Meta<ILogAppender>> _appenders;
     
        public Log(IEnumerable<Meta<ILogAppender>> appenders)
        {
            _appenders = appenders;
        }
     
        public void Write(string destination, string message)
        {
             var appender = _appenders.First(a => a.Metadata["AppenderName"].Equals( destination));
            appender.Value.Write(message);
        }
    }

    可以像下面那样通过使用 Meta<Lazy>或者the .NET 4 Lazy<T, TMetadata>,不创建component的也可以访问元数据。

    强类型的元数据

    为了防止使用字符串来描述元数据,可以为每条元数据指定一个可读的属性,通过继承IAppenderMetadata

    1
    2
    3
    4
    public interface IAppenderMetadata
    {
            string AppenderName { get; }
    }

    在注册时,可以使用WithMetadata 的重载方法去关联值:

    1
    2
    builder.Register(c => new ScreenAppender())
    .As<ILogAppender>().WithMetadata<IAppenderMetadata>(m =>  m.For(am => am.AppenderName, "screen"));

    (这里有一个更高级的例子)

    NET4.0中,autofac支持 Meta<T, TMetadata> System.Lazy<T, TMetadata> 冲强类型接口中读取值。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public class Log
    {
            readonly IEnumerable<Lazy<ILogAppender, ILogAppenderMetadata>> _appenders;
     
            public Log(IEnumerable<Lazy<ILogAppender, ILogAppenderMetadata>> appenders)
            {
                _appenders = appenders;
            }
     
            public void Write(string destination, string message)
            {
                var appender = _appenders.First(a => a.Metadata.AppenderName == destination);
            appender.Value.Write(message);
            }
    }

    注意强类型属性AppenderName的使用

     

    注册和使用元数据是分开的,所以你可以通过弱类型技术来使用强类型的元数据,反之亦然。

    注意:Autofac1.4版本中, "extended properties"就是元数据,这个特征已经被元数据代替。

  • 相关阅读:
    《Linux设备驱动开发详解(第2版)》配套视频登录51cto教育频道
    异常Address already in use: JVM_Bind的处理
    你的Jsp页面有黄×么,有黄色问号么?Multiple annotations found at this line:
    dispatch_get_current_queue 废弃
    二叉树代码(较全)
    ArrayList and LinkedList
    android的tabhost+RadioGroup+PopupWindow
    子进程继承父进程的当前工作目录的问题
    oracle AWR深入研究分析,如何使用
    Linux下对后台进程通过kill传递信号不起作用的问题
  • 原文地址:https://www.cnblogs.com/sandea/p/3289930.html
Copyright © 2020-2023  润新知