方法註入, 其實就是在註冊類的時候, 把這個方法也註冊進去. 那麼在生成實例的時候, 會自動調用這個方法. 其實現的方法, 有兩種. 準備工作: 1. 方法一 - 常規方法 執行時機 : 首先執行的, 肯定是Person的構造函數, 然後回去調用這個方法, 調用過程中, 發現了IAnimal 參數, ...
方法註入, 其實就是在註冊類的時候, 把這個方法也註冊進去. 那麼在生成實例的時候, 會自動調用這個方法.
其實現的方法, 有兩種.
準備工作:
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前面執行. 但是他們都是在構造函數後面執行.