簡體   English   中英

關注點分離:創建基礎庫並刪除對具體類的依賴

[英]Separation of Concerns: Create base library and remove dependencies on concrete classes

我們有一種情況,我們為應用程序開發DLL插件。 所有插件都有一組通用的源文件。 但是,我希望將它們分成一個基礎庫。 我們有以下實現,它們只是一個DLL項目的一部分:

// dllentry class
BaseImporter* spImporter = NULL;
    extern BaseImporter* createImporterImplementation(const std::string& pDllFileName);

int __stdcall DllImportOpen(
            const char* pDllFileName,
            const char** ppImporterUniqueName,
            const char** ppImporterVersion)
{
    // method implementation in concrete class source file
    spImporter = createImporterImplementation(pDllFileName);

    (*ppImporterUniqueName) = spImporter->GetUniqueName();
    (*ppImporterVersion) = spImporter->GetImporterVersion();
    return (0);
}

// base importer class

class BaseImporter()
{
public:
    const char* GetUniqueName() const {return mUniqueName.c_str();}
    const char* GetImporterVersion() const {return mVersion.c_str();}
protected:
    // some pure virtual methods here
}

// concrete class
class XImporter : BaseImporter() 
{
    // implement base importer
}

// resides in XImporter source file
BaseImporter* createImporterImplementation(
            const std::string& dll_filename)
{
    return new XImporter (dll_filename);
}

當一起構建為1個DLL時,此方法工作正常。 但是,我想將dllentry類和BaseImporter到一個基礎庫中。 顯然,這將在編譯基礎庫時創建鏈接器錯誤,因為它將搜索createImporterImplementation的實現。 如何很好地分離可與具體庫一起使用的基礎庫?

一種解決方案是后期綁定createImporterImplementation。 嘗試類似的操作(注意,完全未經測試,可能是錯誤的詳細信息)

// in base DLL:
BaseImporter* createImporterImplementation(
        const std::string& dll_filename)
{
   HMODULE h - LoadLIbrary (dll_filename.c_str());
   BaseImporter* (*fn)() = GetProcAddress(h, CreateImporterImplementation);
   return (*fn)();
}

然后在具體的進口商中:

__declspec(dllexport) BaseImporter* createImporterImplementation()
{
    return new XImporter;
}

這能回答問題嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM