2012-11-10 37 views
1

嗯,我有一個項目,並在我使用.NET 4.0的那一刻,因爲我希望這個應用程序與Windows XP兼容,因爲EF 5.0僅適用於Windows 7和更高版本。如何爲不同版本的.NET只有一個項目?

但是,我想實現應用程序的某些部分與.NET 4.5的功能,如EF 5.0。

因此,對於我的數據庫訪問,我有一個使用EF 4.0的轉儲類,這是一個獨立的dll,因此我可以創建其他使用EF 5的存儲庫dll,並且在我的項目中導入了兩個dll,然後我可以實例化根據EF 5.0的版本,我可以使用正確的存儲庫。這是配置文件中的參數。這是最好的方式嗎?

我問這是因爲我不知道我必須在哪裏聲明我的界面。因爲我的存儲庫類需要實現這個接口,但是這會將我的dll綁定到我的應用程序,但我需要在兩個不同的應用程序中使用這個存儲庫,所以我想實現一次,並在許多應用程序中使用。我想要獨立的dll,因爲現在有兩個應用程序,但將來可以更多。

想要在使用存儲庫的應用程序中使用接口的原因是因爲我想根據配置文件設置在運行時實例化正確的存儲庫。所以在未來,我可以實現新的存儲庫,並且不需要更改代碼。編輯1:我讀了關於多目標定位,但如果在我的項目中使用.NET 4.0的功能,我想編譯爲3.5,我得到一個錯誤,因爲這個功能不存在於3.5。這是正確的。那麼唯一的辦法是維護兩個不同的項目?這將是一項雙重工作。

謝謝。 Daimroc。

+1

只是幾個意見。 EF5可用於.NET 4和.NET 4.5,但某些新功能僅在使用.NET 4.5時纔可用。 EF6,目前可從NuGet獲得alpha1,支持除.NET 4和.NET 4.5上的異步外的所有功能。 –

回答

1

所以對於我的數據庫訪問我,現在使用EF 4.0,這是一個獨立的DLL中的reposotry類,這樣我就可以創建使用EF 5,並在我的項目導入這兩個DLL的其他庫DLL,然後我可以 根據我可以使用的EF 5.0 的版本實例化正確的存儲庫。這是配置文件中的參數。這是 最好的方法嗎?

你可以走這條路,我真的沒有看到它的問題,除非你認爲這可能會導致未來的維護/開發令人頭疼。還有其他一些可以考慮的事情。我認爲兩者都是完全有效的,可能只是個人意見/偏好。

  1. 模塊你可以去的地方你的資料庫DLL被潛在的動態加載模塊的路線。看看Microsoft's Unity library。這應該允許您在每個存儲庫DLL中創建一個IModule,以便根據需要設置您的應用程序。然後創建一個UnityBootstrapper類來告訴它如何找到你的模塊(手動添加它們,查看目錄等)。這應該允許你熱切換你的版本庫DLL,而不必擔心如果你不想設置一個配置文件。
  2. 預處理器指令通過預處理指令,您可以定義代碼的編譯方式。根據你的課程結構,這可能是相當簡單的設置,或者是一個讓你想要抽象和重構類的完整噩夢。這個問題:Detect target framework version at compile time根據目標框架有一個處理不同編譯結果的答案。就個人而言,我喜歡模塊化路線。

我問這是因爲我不知道我必須在哪裏聲明我的接口。 ,因爲我的存儲庫類需要實現這個接口,但是 然後這綁定我的dll到我的應用程序,但我需要在兩個不同的應用程序中使用這個 存儲庫,所以我想實現 一次,並在許多應用程序中使用。我想要獨立的dll,因爲 現在是兩個應用程序,但將來可以更多。

想要在使用 存儲庫的應用程序中使用接口的原因是因爲我想根據配置文件設置在運行時實例化 正確的存儲庫。所以在 fututre我可以實現新的存儲庫,並沒有必要 更改代碼。

聽起來像您需要創建另一個用於在您的UI和您的Repository庫之間進行通信的庫。這可能有點棘手,並且壓倒性地設置恰到好處。基本上你需要你的網關DLL來存放接口和業務對象。您的應用程序將引用此DLL,並且此DLL將引用您的存儲庫。

根據您的需要,您可能實際上需要設置另一個實際上只包含接口和最基本實用程序類的中間DLL。這將允許您使EF對象實現應用程序所使用的相同接口,而無需網關DLL必須來回映射業務對象和EF對象。

EDIT1:我瞭解的多目標,但如果我的項目,我用 功能例如.NET 4.0,我想complie 3.5,我得到 一個錯誤,因爲該功能不存在3.5 。這是正確的。 那麼唯一的辦法是維護兩個不同的項目?這將是一個 雙重工作。

我相信你可以通過使用上面提到的預處理器指令來解決這個問題。下面只是一個根據框架是否爲.NET 2.0來使方法處理工作有所不同的示例;這只是一個例子,沒有經過測試。 DefineConstants將需要設置,但是這應該允許您爲多個框架目標處理1個項目,同時還可以在發佈時使用更新的.NET功能。

public Person FindPersonByName(List<Person> people, string name) 
{ 
#if DOTNET_20 
    foreach(Person person in people) 
    { 
     if (person.Name == name) 
      return person; 
    } 
    return null; 
#else 
    return people.FirstOrDefault(p => p.Name == name); 
#endif 
} 

我希望這是有用的,並找到正確的解決方案的好運。

+0

非常感謝。 –

相關問題