如何用C++反射實(shí)現(xiàn)依賴注入

c++
小樊
84
2024-09-10 18:16:23
欄目: 編程語言

在 C++ 中,我們可以使用模板和工廠函數(shù)來實(shí)現(xiàn)依賴注入。這里是一個(gè)簡單的例子:

首先,定義一個(gè)接口 IService 和實(shí)現(xiàn)該接口的類 ServiceAServiceB

#include<iostream>
#include<memory>

// 定義接口
class IService {
public:
    virtual void execute() = 0;
};

// 實(shí)現(xiàn)類 ServiceA
class ServiceA : public IService {
public:
    void execute() override {
        std::cout << "ServiceA is executing."<< std::endl;
    }
};

// 實(shí)現(xiàn)類 ServiceB
class ServiceB : public IService {
public:
    void execute() override {
        std::cout << "ServiceB is executing."<< std::endl;
    }
};

然后,創(chuàng)建一個(gè)工廠函數(shù),根據(jù)輸入?yún)?shù)創(chuàng)建不同類型的服務(wù)對(duì)象:

std::unique_ptr<IService> createService(const std::string& serviceType) {
    if (serviceType == "ServiceA") {
        return std::make_unique<ServiceA>();
    } else if (serviceType == "ServiceB") {
        return std::make_unique<ServiceB>();
    } else {
        throw std::invalid_argument("Invalid service type.");
    }
}

最后,通過依賴注入將服務(wù)對(duì)象傳遞給需要它的類:

class Client {
public:
    explicit Client(std::unique_ptr<IService> service) : m_service(std::move(service)) {}

    void doWork() {
        m_service->execute();
    }

private:
    std::unique_ptr<IService> m_service;
};

在主函數(shù)中,我們可以根據(jù)需要選擇具體的服務(wù)類型,并將其注入到客戶端中:

int main() {
    // 選擇具體的服務(wù)類型
    std::string serviceType = "ServiceA";

    // 使用工廠函數(shù)創(chuàng)建服務(wù)對(duì)象
    auto service = createService(serviceType);

    // 將服務(wù)對(duì)象注入到客戶端中
    Client client(std::move(service));

    // 客戶端執(zhí)行操作
    client.doWork();

    return 0;
}

這樣,我們就實(shí)現(xiàn)了基于 C++ 的依賴注入。當(dāng)需要更改具體的服務(wù)實(shí)現(xiàn)時(shí),只需修改 main() 函數(shù)中的 serviceType 變量即可,而無需修改客戶端代碼。

0