Hasor 程序入口

2018-10-03 09:42 更新

A.加載Module


當(dāng)您使用 Hasor 時(shí)讓框架跑起來只是第一步,您還需要一個(gè)啟動(dòng)入口用于配置您項(xiàng)目。在這個(gè)啟動(dòng)入口里您可以為您的項(xiàng)目做一些實(shí)際的設(shè)定。


在 Hasor 里一切的開始都是 net.hasor.core.Module 接口,您需要編寫一個(gè)類實(shí)現(xiàn)這個(gè)接口,接口中只有一個(gè)方法需要您實(shí)現(xiàn)。下面這段代碼就是我們實(shí)現(xiàn)的第一個(gè) Module:

public class FirstModule implements Module {
    public void loadModule(ApiBinder apiBinder) throws Throwable {
        ...
    }
}


接下來我們迫切需要的是讓 Hasor 可以加載這個(gè) Module。對于一般情況下而言我們可以在 Hasor.create 時(shí)進(jìn)行加載,例如:

Hasor.createAppContext(new FirstModule());


有時(shí)候?yàn)榱藴p少代碼行數(shù)我們會(huì)把 FirstModule 簡寫成一個(gè)匿名類,例如:

Hasor.createAppContext(new Module {
    public void loadModule(ApiBinder apiBinder) throws Throwable {
        ...
    }
});


如果您打算同時(shí)指定 Hasor 配置文件那么會(huì)變成如下寫法:

Hasor.createAppContext("my-config.xml", new FirstModule());
or
Hasor.createAppContext("my-config.xml", new Module {
    public void loadModule(ApiBinder apiBinder) throws Throwable {
        ...
    }
});


如果我有多個(gè)啟動(dòng)入口怎么辦?沒關(guān)系 Hasor 支持多個(gè)啟動(dòng)入口,你只需要按照你想要的啟動(dòng)順序排好,然后在 Hasor.createAppContext 啟動(dòng)容器時(shí)候傳遞進(jìn)去就可以了,Hasor 會(huì)自動(dòng)照顧好它們。


B.加載多個(gè)Module


前面我們一直說的是如何在啟動(dòng)時(shí)候通過參數(shù)形式加載啟動(dòng)入口,現(xiàn)在我們就來想象一下如下情景。一個(gè)項(xiàng)目,按照業(yè)務(wù)緯度劃分了若干個(gè)模塊。每個(gè)模塊都可以通過 Hasor 的 Module 來管理,接下來那么為了方便開發(fā),每個(gè)模塊負(fù)責(zé)人會(huì)負(fù)責(zé)開發(fā)自己的 Module,最后在統(tǒng)一的地方進(jìn)行加載。


剛剛這個(gè)例子來說,Hasor 提供了多種方式來加載這些 Module,現(xiàn)在我們就來看看不同的加載方式和它們的優(yōu)缺點(diǎn)。


方式一: Hasor.createAppContext 在初始化 Hasor 容器時(shí)指定所有模塊。這種方式簡單粗暴,無需過多語言進(jìn)行描述。它的缺點(diǎn)比較明顯,那就是隨著項(xiàng)目復(fù)雜度的提升 Module 可能會(huì)越來越多。到時(shí)候創(chuàng)建 Hasor 會(huì)看起來很復(fù)雜。

Hasor.createAppContext("my-config.xml", new UserModule(),new ClassModule() ...);


方式二: 為了解決第一種方式中帶來的不足,我們可以預(yù)先創(chuàng)建一個(gè)總?cè)肟?,然后在總?cè)肟谥兄饌€(gè)加載所有模塊。不光如此總?cè)肟谖覀円部梢栽O(shè)置多個(gè),甚至總?cè)肟谥屑虞d的模塊可以是項(xiàng)目中其它模塊的入口。這種方式解決了 Module 的規(guī)劃和加載問題。

public class RootModule implements Module {
    public void loadModule(ApiBinder apiBinder) throws Throwable {
        ...
        apiBinder.installModule(new UserModule());
        apiBinder.installModule(new ClassModule());
        ...
    }
}


方式三: 前面提到的兩種方式最大的弊病就是,需要把要加載的模塊寫死在代碼中。倘若我有一個(gè)需求是根據(jù)實(shí)際情況來決定是否要加載,最好的辦法就是讓我們自己可以在某個(gè)地方自己配一下。而這就要用到 Hasor 配置文件中模塊管理功能。這種方式最大的好處就是模塊的加載可以和代碼解耦,在 Hasor 自身內(nèi)部就大量使用了這種方式。例如配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://project.hasor.net/hasor/schema/main">
    <!-- 默認(rèn)要裝載的模塊 -->
    <hasor.modules>
        <module>net.hasor.web.valid.ValidWebPlugin</module>
        <module>net.hasor.web.render.RenderWebPlugin</module>
        <module>net.hasor.plugins.startup.StartupModule</module>
        <module>net.hasor.plugins.aop.AopModule</module>
    </hasor.modules>
</config>


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號