文章出處

方法注入, 其實就是在注冊類的時候, 把這個方法也注冊進去. 那么在生成實例的時候, 會自動調用這個方法.

其實現的方法, 有兩種.

準備工作:

public interface IAnimal
{
    void Say();
}

public class Dog : IAnimal
{
    public string Name { get; set; }
    public void Say()
    {
        Console.WriteLine("汪汪汪!");
        if (!string.IsNullOrEmpty(Name))
        {
            Console.WriteLine("此汪名叫 " + Name);
        }
    }
}

public class Person 
{
    public void Say(IAnimal adopt)
    {
        Console.WriteLine("我領養了一只小動物");
        adopt.Say();
    }
}

1. 方法一 - 常規方法

var builder = new ContainerBuilder();

builder.RegisterType<Dog>().As<IAnimal>();
builder.Register(c =>
{
    var result = new Person();
    result.Say(c.Resolve<IAnimal>());
    return result;
});

var container = builder.Build();

var person = container.Resolve<Person>();

執行時機 : 首先執行的, 肯定是Person的構造函數, 然后回去調用這個方法, 調用過程中, 發現了IAnimal 參數, 然后去加載參數的構造函數, 再回來執行Say方法, 一直到Say結束.

2. 方法二 - OnActivating/OnActivated

var builder = new ContainerBuilder();

builder.RegisterType<Dog>().As<IAnimal>();

builder.RegisterType<Person>().OnActivated(e => e.Instance.Say(e.Context.Resolve<IAnimal>()));

var container = builder.Build();

var person = container.Resolve<Person>();

結果是一樣的, 就不貼了.

上一次的例子, 我用的是 OnActivating, 這里用后面一個好了, 實際過程中, OnActivating方法在OnActivated前面執行. 但是他們都是在構造函數后面執行.


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()