Unity用法(構造器注入的兩種方法)

來源:互聯網
上載者:User

對象的之前的依賴關係的表現方式之一,主對象通過構造器將其所依賴對象的執行個體的引入,並在將來的某個時候應用該執行個體。 而IOC對於該問題的解耦方法是應用

Constructor Injection 方式。

 什麼情況下使用Constructor Injection

  • 當執行個體化父物件時也能自動執行個體化所依賴的對象
  • 通過簡單的方式使得很容易做到在代碼中查看每個類所依賴的項
  • 父物件的構造器不需要很多相互間有關聯關係的構造器
  • 父物件的構造器不需要很多參數
  • 通過不使用屬性和方法暴露給調用程式,達到封裝欄位值以不能被看到的目的
  • 通過修改依賴對象的代碼來控制哪些對象可以被注入,而不用改動父物件或應用程

 

 代碼方式:

準備工作

public class Song
{
    public string Singer
    {
        get
        {
            return "Westlife";
        }
    }

    public string Name
    {
        get
        {
            return "My Love";
        }
    }
}

public class Owner
{
    public string Name
    {
        get
        {
            return "Inrie";
        }
    }

    public int Age
    {
        get
        {
            return 24;
        }
    }
}

public interface IPlayer
{
    void Play();
}

 

開始

根據類構造器的個數分成下面兩種情況:
1.單個構造器
2.多個構造器

1.單個構造器:

Unity對於單個構造器的情況,將做自動的依賴注入。

看個例子:

public class Mp3Player : IPlayer
{
    public Song mSong;

    public Mp3Player(Song song,Owner owner)
    {
        this.mSong = song;
    }

    public void Play()
    {
        Console.WriteLine(string.Format("Now Playing [{0}] Singing by ({1})", this.mSong.Name, this.mSong.Singer));
    }
}


可以通過下面的方式來擷取Mp3Player對象執行個體。

IUnityContainer container = new UnityContainer();
container.RegisterType<IPlayer, Mp3Player>();

IPlayer player = container.Resolve<IPlayer>();

player.Play(); 

 輸出為:


上例中Mp3Player類中只有一個構造器,該構造器依賴於兩個類:Song和Owner類。Unity容器在執行Resolve方法時會自動裝配所依賴類的執行個體,注入到構造器中。

當類中只有一個構造器時,Unity容器在裝配時自動以此構造器為預設構造器。

2.多個構造器:

Unity對於多個構造器的情況,需要配合[InjectionConstructor]特性來實現依賴注入。

有以下幾個原則:
A.有加上[InjectionConstructor]標籤的構造器為依賴注入的構造器

public class Mp3Player : IPlayer
{
    public Song mSong;

    [InjectionConstructor]
    public Mp3Player(Owner owner)
    {
        
    }

    public Mp3Player(Song song,Owner owner)
    {
        this.mSong = song;
    }

    public void Play()
    {
        Console.WriteLine(string.Format("Now Playing [{0}] Singing by ({1})", this.mSong.Name, this.mSong.Singer));
    }
}

該例中為 Mp3Player(Owner owner) 構造器貼上[InjectionConstructor]標籤,所以該構造器將作為依賴注入的構造器。

B.如果沒有任何構造器有貼上[InjectionConstructor],則使用參數最多的構造器作為依賴注入的構造器

public class Mp3Player : IPlayer
{
    public Song mSong;

    public Mp3Player(Owner owner)
    {
        
    }

    public Mp3Player(Song song,Owner owner)
    {
        this.mSong = song;
    }

    public void Play()
    {
        Console.WriteLine(string.Format("Now Playing [{0}] Singing by ({1})", this.mSong.Name, this.mSong.Singer));
    }
}

該例中由於有多個構造器,同時也沒有為任何一個構造器貼上[InjectionConstructor]標籤,則使用參數最多的構造器,即Mp3Player(Song song,Owner owner)構造器作為依賴注入的構造器。

這裡有一點需要注意:如果有多個構造器都是屬於"參數最多"的構造器,則會出現錯誤。

注入到存在的對象執行個體

用Resolve方法來擷取已存在的對象執行個體時不會做 Constructor  Injection,因為該對象的建立沒受到 Unity 容器的任何影響。甚至用BuildUp方法也不行。作為取代的方法,可以採用 Property Injection。

關於BuildUp方法可參考:
Unity Application Block 1.0系列(5): 使用BuildUp讓對象執行個體也支援依賴注入 

關於Property Injection可參考:

Unity Application Block 1.0系列(3): 屬性/設值方法注入(Property/Setter Injection)  

 

設定檔方式:

首先在設定檔中引入以下配置節,前提是要先加上類型別名。即加上<typeAlias>配置節。

 

        <register  type="Database"                mapTo="UnityTestLib.CustomDatabase,                UnityTestLib">          <constructor>            <param name="connString" type="System.String">              <value value="connection value..."/>            </param>            <param name="logger" type="ILogger">              <dependency />            </param>          </constructor>

        </register > 

然後在代碼中應用container.Resolve<Database>();得到DataBase的執行個體。

完整的代碼是:

IUnityContainer container = new UnityContainer();            var section =               (UnityConfigurationSection)ConfigurationManager.GetSection("unity");            section.Configure(container);            Database database = container.Resolve<Database>();

            

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.