Autofac之依賴注入

這裏主要學習一下Autofac的依賴注入方式函數

默認構造函數注入學習

class A
{
    public B _b;

    public A()
    {

    }
    public A(B b)
    {
        this._b = b;
    }
}

class B { }
builder.RegisterType<A>();
builder.RegisterType<B>();
using (var container = builder.Build())
{
    //A的構造方法須要參數b,可是這裏不須要作更多地操做,若是不註冊類型B,這裏a._b=null
    var a = container.Resolve<A>();
}

若是類型A和類型B都註冊到了autofac中,那麼在經過autofac解析獲取A時,autofac會檢測到A的構造方法中是要一個參數B,而類型B是已經註冊到autofac中的,因此autofac會自動建立b參數,而後傳入A的構造方法中的。這樣,autofac就自動幫咱們完成了構造注入的工做ui

屬性注入

屬性注入的全部注入方式都是在註冊時定義的,不像構造注入那般,能夠在Resolve時傳參注入。構造器注入是默認行爲,不須要設置,默認會去檢查,而屬性注入並非默認行爲。可是咱們能夠經過設置,讓屬性注入也成爲自動注入。this

經過反射,使用PropertiesAutowired()修飾符注入屬性spa

builder.RegisterType<A>().PropertiesAutowired();
builder.RegisterType<B>();

using (var container = builder.Build())
{ 
    var a = container.Resolve<A>();
}

使用PropertiesAutowired也只是能指定某個類會自動進行屬性注入,沒有一鍵設置全部類型都會自動注入屬性的設置。並且還須要注意一點,設置了自動屬性注入後,也不表明全部屬性都會自動注入,只有註冊到Autofac中的類型才能自動注入。PropertiesAutowired方式會自動注入全部能夠注入的屬性(在容器中已註冊的類型中尋找),可是若是隻想注入指定幾個屬性,可使用除PropertiesAutowired之外的幾種注入方式code

若是預先知道屬性的名字和值,可使用:WithProperty,此時類型B是能夠不被註冊的,由於在WithProperty方法中進行了實例化blog

builder.RegisterType<A>().WithProperty("_b", new B());
using (var container = builder.Build())
{
    var a = container.Resolve<A>();
}

lambda表達式it

builder.Register(c => new A { _b = c.Resolve<B>() });
builder.RegisterType<B>();
using (var container = builder.Build())
{
    var a = container.Resolve<A>();
}

 方法注入class

使用Activator:注意,使用這種方法,類裏必需要有這個方法容器

class A
{
    public B _b;
    public A()
    {

    }
    public A(B b)
    {
        this._b = b;
    }

    public void SetInject(B b)
    {
        _b = b;
    }
}
builder.Register(c =>
{
    var _a = new A();
    _a.SetInject(new B());
    return _a;
});
using (var container = builder.Build())
{
    var a = container.Resolve<A>();
}

 SetInject爲A的一個方法,而且它須要一個類型爲B的參數,咱們在外部經過方法的方式將B傳入,這就是方法注入

使用Activating Handler 一行代碼解決

builder.Register<A>(c => new A()).OnActivating(e => e.Instance.SetInject(new B()));
using (var container = builder.Build())
{
    var a = container.Resolve<A>();
}
相關文章
相關標籤/搜索