標籤:注入 png ges interface var 結束 tin turn console
方法注入, 其實就是在註冊類的時候, 把這個方法也註冊進去. 那麼在產生執行個體的時候, 會自動調用這個方法.
其實現的方法, 有兩種.
準備工作:
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前面執行. 但是他們都是在建構函式後面執行.
Autofac - 方法注入