2010-11-16 191 views
3

我忙於學習棱鏡4和一切的進出,但我還沒有看到一個教程/走過我想完成什麼。希望這裏有人已經或者正在從事類似的項目。棱鏡模塊和數據庫

我的應用程序是一個基本的CRUD應用程序,我將它分解爲單獨的關注區域和模塊。但是,我希望所有模塊共享一個本地SQL Express數據庫。數據庫將從僅僅有限數量的表開始,每個模塊將檢查數據庫中所需的表,如果它們不在那裏,則創建它們。我該如何去做到這一點?

我想過剛開始添加我所有的表格,但這似乎打破了我腦海中模塊化的原則。也許我的想法是錯誤的,但是如果數據庫已經完全知道並且從數據庫創建中強有力地耦合到給定模塊,那麼鬆散耦合模塊會有什麼意義?

尋找一些見解。

回答

3

你似乎在問兩個問題。首先是:我如何使用PRISM來確保我的模塊特定模式存在於數據庫中,如果沒有,請創建它。第二個問題是:如何最好地構建我的數據層,以便在模塊化應用程序中解耦。

要獲得關於如何做的模塊架構檢查的第一個問題,我要說的是:

如果你已經經歷棱鏡,你無疑想出了幾種方法來完成它。和編程中的任何東西一樣,有很多方法可以實現它。如果我需要使用Prism完成此操作,我可能會執行以下操作:在實現Microsoft.Practices.Prism.Modularity.IModule接口的模塊組合件中創建一個類(MyPlugInModule.cs)。然後我將代碼放入構造函數或Initialize方法中,該方法檢查數據庫以查看模塊模式是否存在。如果沒有,則創建它。

要獲得關於如何最佳結構數據模塊的第二個問題,我要說的是:

像精靈說,這真的取決於你所要完成的是什麼類型的模塊性。如果您正在銷售該應用程序,並且想要將模塊作爲獨立軟件包銷售,那麼您可能不希望創建數據模型來支持軟件包,直到最終用戶付費。

您應該能夠使用實體框架來確保您的模塊能夠與基本應用程序模塊共享實體。此外,根據您的要求,或者您的架構允許,您可能需要將模型/數據層抽象爲與模塊不完全對齊的裝配。這將減少代碼重複和依賴性。

在我目前正在使用的應用程序上,我們使用帶MVVM的WPF,帶MEF的PRISM和WCF數據服務。我們的客戶端模塊共享一個數據程序集,它與位於基本應用程序模型之上的主數據服務端點(身份驗證/角色表,應用程序數據等)進行通信。當創建數據庫中特定於模塊域的表時,將在服務器上創建新模型和服務端點,並在客戶端上創建一個單獨的程序集以與數據模型進行通信。

如果特定於模塊的模型發生更改,則只有受影響的組件必須更改,因爲模塊特定的數據將封裝在其自己的服務和客戶端組合件中。從測試,安全性等方面的隔離角度來看,這是一個更好的選擇。當然,如果基本應用程序模型發生變化,所有關聯的模塊特定實現都必須更新,那麼缺點就是如此。

但是,這又取決於您的要求。如果您堅持使用MEF,模塊化設計模式和實體框架4的PRISM 4,您應該能夠提出一種模塊化而不緊密耦合的優秀解決方案。

+0

難道這就是你要找的人的見解? – BernicusMaximus 2010-11-29 20:42:17

+0

+1爲一個很好,深思熟慮的答案。 – 2011-01-08 04:37:25

2

如果你的模塊是真正獨立的 - 每個模塊的數據庫怎麼樣?如果你需要模塊之間的外鍵 - 它們本質上並沒有真正的封裝 - 並且我將整個數據庫從一開始就發揮作用。在更新之間保持模式更新容易得多。

模塊化有許多種 - 業務視角(按次付費模塊),模塊化的責任等等,等等方面

我5分錢:)

0

此迴應適用於任何想要查看連接本地數據庫的代碼的人士。它適用於我,不知道這是否是最佳做法。

我使用棱鏡,我需要讓我的數據庫工作。這是我做的。實體框架似乎「只是工作」把數據庫放在某個地方。

Bootstrapper.cs文件:

.... 
protected override void ConfigureContainer() { 
    base.ConfigureContainer(); 
    // Register my navigation 
    Container.RegisterType<IAppDatabaseContext, AppDatabaseContext>(); 
} 
.... 

我AppDatabaseContext.cs文件:

public class AppDatabaseContext : DbContext, IAppDatabaseContext { 
    DbSet<MyModelOne> MyModelOnes { get; set; } 
    DbSet<MyModelTwo> MyModelTwos { get; set; } 
    DbSet<MyModelThree> MyModelThrees { get; set; } 
} 

public interface IAppDatabaseContext { 
    DbSet<MyModelOne> MyModelOnes { get; set; } 
    DbSet<MyModelTwo> MyModelTwos { get; set; } 
    DbSet<MyModelThree> MyModelThrees { get; set; } 

    int SaveChanges(); 
    // Other methods needed to use the DbContext 
} 

在我的ViewModels之一:

public ConstructorMethod(IEventAggregator eventAggregator, IAppDatabaseContext dbContext) { 
    _db = dbContext; // I then use this in my Observed Properties 
}