2012-05-24 206 views
1

我有一個包含三個項目的一個Visual Studio 2010解決方案:Visual Studio解決方案有多個項目:參考路徑

  • Windows服務將從一個SQLite數據庫中讀取數據來執行操作
  • WinForms應用程序這將提供配置服務的行爲(通過更新SQLite數據庫)
  • 一個類庫項目來抽象所有數據庫訪問從服務和配置應用程序走的方法(使它更容易在未來有任何更新處理數據庫而不必搜尋中的查詢其他兩個項目)

所有這些項目都在相同的解決方案,我已經從Winforms應用程序和服務添加到類庫的引用。在這兩個項目中,我能夠看到類庫中的類並與它們進行交互,但是我遇到了問題。我已經在我的類庫項目的/ Resources /目錄中創建了數據庫(因爲對我來說,「common」項目是存儲公共數據庫的唯一明智的地方),但是無論何時我嘗試訪問Winforms應用程序中的數據庫,它並不是返回我知道的數據。由於System.Data.SQLite具有創建一個空的數據庫文件的默認行爲,如果沒有找到該文件(在我看來這是一個奇怪的選擇),我甚至不能回去告訴數據庫是否存在。

這使我懷疑我不理解如何正確地從一個項目文件中相互參照。這裏是我的項目是什麼樣子:

Screenshot of the Solution Manager in VS

WorkModeCommon包含的類SQLiteDatabase和ScheduleManager,其中ScheduleManager有一個SQLiteDatabase()和SQLiteDatabase與資源交互/ WorkModeSchedules.s3db

無論是WorkModeConfigApp和WorkModeService有一個WorkModeCommon.ScheduleManager(),理論上它應該處理所有的數據庫交互。

難道我有一個很大的缺點在我的設計,或者可能有人點我的資源,可以幫助我解決我遇到的問題?

+0

從另一個項目中調用方法時,代碼在調用項目的上下文中運行,而不是在調用的項目中運行。這就是爲什麼,例如,當你引用'ConfigurationManager'時,你必須小心設置在當前正在執行的項目中,而不是包含引用'ConfigurationManager'的類文件的項目 - 這是一個常見的錯誤。 – mellamokb

+0

對於如何存儲/引用資源,您是否有任何建議,以便可以在安裝該程序的任何系統上的公共位置訪問這些資源? –

回答

0

好的夥計們,我解決了我的問題。我所做的是在每個項目中包含一個數據庫文件的副本,並將其他所有實例(「公共」項目)中的「複製到輸出目錄」屬性設置爲「不復制」。之後,我將所有三個項目的輸出目錄更改爲同一目錄(更具體地說,我創建了集中的調試和發佈目錄,並將正確的構建配置指向適當的目錄)。我現在可以使用單個DB文件和集中式類庫成功進行測試!

1

我認爲這是發生了什麼事。
當您引用公共類庫時,它僅僅使用.dll輸出作爲參考,因爲它是唯一的輸出。
不過,如果你在.s3db右鍵單擊文件並轉到它的屬性,你可以設置它的Copy to Output Directory設置Copy if newer,這樣數據庫文件本身是在輸出目錄,所以.dll文件可以看到它。現在
,當你的形式或服務的訪問從您共同類庫項目的輸出目錄的.dll文件,它會引用.s3db文件,也因此那麼他們都會看到相同的數據。

這是否是一個好的設計或不取決於你的需要。
如果表單和服務都看在同一時間相同的數據,那麼你必須確保他們至少在看相同的文件,而不是在自己的.s3db文件的副本。
如果只是訪問數據庫的表單或服務,我可以確定,但由於多個進程(表單和服務)正在訪問它,所以常見的數據庫服務器是一個不錯的選擇。

+0

在大多數情況下,只有服務將訪問數據庫,並且該服務將只讀取數據庫,它不會寫入數據庫。目標是配置應用程序將在最初運行一次,然後極少發生。 –

1

編譯後的類對於引用它們的外部程序集是可見的,只要它們的可見性是公共的(有一些例外)。非編譯文件是一個不同的故事。您可以將構建操作指定爲「嵌入式資源」,這將允許您從引用程序集訪問該文件,儘管是以只讀方式訪問。另一種選擇,可能是你想要的,就是將「複製到輸出目錄」指定爲「始終複製」或「如果更新則複製」。這會在構建時將文件複製到輸出目錄。

1

當您開始調試您的WorkModeConfigApp時,應用程序將從其bin \ debug目錄運行,並且無法訪問類庫的資源目錄。簡單地引用類庫並不意味着VS複製配置應用程序的bin/debug內的類庫的資源目錄。如果您爲類庫設置了Copy Local = true,VS會將編譯後的DLL複製到WorkModeConfigApp的bin \ debug中,但不復制資源目錄的內容

另一方面,您可以設置屬性copy to the output directory對於.s3db文件,通過這種方式,文件及其目錄將被複制到WorkModeConfigApp的bin \ debug中。但是這會成爲其他問題的根源,因爲在調試期間,您的測試數據庫風險會被來自類庫的風險所覆蓋。

我認爲你最好的選擇是保存配置文件的服務和配置應用程序在哪裏找到這個文件,不要混淆上述屬性。

我們正在討論一個數據庫,所以可能在應用程序和服務的配置文件中需要添加一個連接字符串。你可以添加所需的節點到您的App.config,見下面的例子:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    </configSections> 
    <connectionStrings> 
     <add name="WindowsFormsApplication1.Properties.Settings.MyDatabaseConnection" 
      connectionString="Data Source=C:\ProgramData\MyAppName\/WorkModeSchedules.s3db;Version=3;Pooling=True;Max Pool Size=100;"/> 
    </connectionStrings> 
</configuration> 

然後,您可以訪問一個使用這些方法這個值:

string cnnString1 = ConfigurationManager.ConnectionStrings["MyDatabaseConnection"]; 
string cnnString2 = Properties.Settings.Default.MyDatabaseConnection; 

(ConfigurationManager中方法需要參考System.Configuration程序集)

+0

我認爲你關於在配置文件中保存數據庫位置的想法是一個好主意,但我不知道數據庫在安裝時最終會與應用程序/服務相關。你有什麼建議如何在配置文件中引用它? –

+0

我無法幫助您在哪裏放置數據庫(通常它是ConfigApp和具有讀/寫權限的服務(如%APPDATA%文件夾)均可訪問的位置)。有關配置文件,請參閱我的更新。 – Steve

相關問題