天天看點

Autofac - 方法注入

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

其實作的方法, 有兩種.

準備工作:

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>();      
Autofac - 方法注入

執行時機 : 首先執行的, 肯定是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前面執行. 但是他們都是在構造函數後面執行.