Hasor 用代碼配置注入

2018-10-06 10:30 更新

前面我們講了很多依賴(lài)注入的功能都是基于注解實(shí)現(xiàn),現(xiàn)在我們回歸原始在這一小節(jié),專(zhuān)門(mén)講解如何通過(guò)代碼形式完成依賴(lài)注入的配置。

在開(kāi)始之前我們先把場(chǎng)景列出來(lái)?,F(xiàn)在我們有一個(gè) “OrderManager” 類(lèi),它在初始化時(shí)會(huì)根據(jù)一些業(yè)務(wù)邏輯來(lái)決定注入的細(xì)節(jié)。例如:具體使用哪一套庫(kù)存系統(tǒng)。

這個(gè)時(shí)候前面講到的各種依賴(lài)注入方式,可能都因?yàn)闆](méi)有太多的靈活性而導(dǎo)致無(wú)法完成場(chǎng)景需要。這個(gè)時(shí)候你可以通過(guò) Hasor 的 InjectMembers 接口完成更加靈活的對(duì)象依賴(lài)注入控制。


具體請(qǐng)看代碼:

public class OrderManager implements InjectMembers {
    @Inject  // <-因?yàn)閷?shí)現(xiàn)了InjectMembers接口,因此@Inject注解將會(huì)失效。
    public StockManager stockBeanTest; 
    public StockManager stockBean;
    //
    public void doInject(AppContext appContext) throws Throwable {
        boolean useCaseA = ...
        if (useCaseA){
            this.iocBean = appContext.findBindingBean(
                "caseA",PojoBean.class);
        }else{
            this.iocBean = appContext.findBindingBean(
                "caseB",PojoBean.class);
        }
        //
    }
}


您要注意的是,為了避免 InjectMembers 接口注入和注解注入同時(shí)生效造成的混亂。一旦您打算使用 InjectMembers 方式進(jìn)行注入 Hasor 就不會(huì)在解析注解進(jìn)行注入。


接下來(lái)我們?cè)诮榻B一種代碼形式的依賴(lài)注入,還是以上面的例子為樣本。我們可以在 Module 中進(jìn)行預(yù)先配置。

public class OrderManager {
    public StockManager stockBean;
    ...
}


實(shí)現(xiàn)注入的 Module 這樣編寫(xiě):

public class MyModule implements Module {
    public void loadModule(ApiBinder apiBinder) throws Throwable {
        ...
        boolean useCaseA = ...;
        BindInfo<StockManager> injectTo = null;
        if (useCaseA){
            injectTo = apiBinder.bindType(StockManager.class)
                    .to(StockManagerCaseA.class).toInfo();
        }else{
            injectTo = apiBinder.bindType(StockManager.class)
                    .to(StockManagerCaseB.class).toInfo();
        }
        apiBinder.bindType(OrderManager.class).inject("stockBean",injectTo);
    }
}



以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)