方法注入, 其實就是在注冊類的時候, 把這個方法也注冊進去. 那麼在生成執行個體的時候, 會自動調用這個方法.
其實作的方法, 有兩種.
準備工作:
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前面執行. 但是他們都是在構造函數後面執行.