天天看點

【Autofac打标簽模式】AutoConfiguration和Bean

【 Autofac打标簽模式】開源DI架構擴充位址:

https://github.com/yuzd/Autofac.Annotation/wiki

讓一個配置類去注冊一些單例對象到DI容器内

  • 打了AutoConfiguration标簽的Class就是配置類
  • 在AutoConfiguration标簽的Class裡面打了Bean标簽的傳回對象就是要注冊的單例對象
【Autofac打标簽模式】AutoConfiguration和Bean

原了解釋:

架構會掃描打了【AutoConfiguration】的class,然後會再掃描打了【Bean】标簽的方法并且Invoke該方法,拿到方法傳回的對象并以單例的形式注冊到DI容器中!

AutoConfiguration标簽支援下面幾個參數配置

【Autofac打标簽模式】AutoConfiguration和Bean
  • Key:如果指定key
  • OrderIndex:值越大越先處理

Key的使用方法請檢視下面的執行個體代碼的注釋

【Autofac打标簽模式】AutoConfiguration和Bean
//這個會加載
    [AutoConfiguration("Test")]
    public class MyConfig
    {
        [Bean]
        public MyModel GetMyModel()
        {
            return new MyModel
            {
                Name = "yuzd"
            };
        }
    }
    
    //這個不會被加載
    [AutoConfiguration("Prod")]
    public class MyConfig2
    {
        [Bean]
        public MyModel GetMyModel()
        {
            return new MyModel
            {
                Name = "yuzd"
            };
        }
    }
    
    // autofac打标簽模式 并且調用了 SetAutofacConfigurationKey方法 指定了 Key 為 “Test”
    // 所有隻會加載 打了且指定了Key=“Test”的AutoConfiguration标簽class
    builder.RegisterModule(new AutofacAnnotationModule(typeof(MyConfig).Assembly).SetAutofacConfigurationKey("Test"));
    
           
//這個會加載
    [AutoConfiguration]
    public class MyConfig
    {
        [Bean]
        public MyModel GetMyModel()
        {
            return new MyModel
            {
                Name = "yuzd"
            };
        }
    }
    
    //這個會被加載
    [AutoConfiguration]
    public class MyConfig2
    {
        [Bean]
        public MyModel GetMyModel()
        {
            return new MyModel
            {
                Name = "yuzd"
            };
        }
    }
    
    // autofac打标簽模式 
    // 沒有指定Key 是以 上面2個都會加載
    builder.RegisterModule(new AutofacAnnotationModule(typeof(MyConfig).Assembly));
    
           

Bean标簽的方法的參數支援注入DI已存在的,或者Value标簽

//方法的參數支援注入DI已存在的,或者Value标簽
        [Bean]
        public MyModel GetMyModel(OtherClass other,[Value("${connetionString}")] connetionString)
        {
            return new MyModel
            {
                Name = "yuzd"
            };
        }
        

           

在業務代碼裡面的使用場景

  1. 使用Key指定可以實作不同的環境配置不同的對象到DI容器
  2. 一些複雜的對象執行個體可以使用Bean的方式注冊的DI容器

如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的“推薦”将是我最大的寫作動力!歡迎各位轉載,轉載文章之後須在文章頁面明顯位置給出作者和原文連接配接,謝謝。

繼續閱讀