棱镜模块和数据库

时间:2010-11-16 02:09:16

标签: sql-server wpf prism

我正在忙着学习Prism 4以及所有内容的进出,但我还没有看到教程/我想要完成的内容。希望有人在这里开展类似的项目。

我的应用程序是一个基本的CRUD应用程序,我已将其分解为关注的区域和模块。但是,我希望所有模块共享一个公共的本地SQL Express数据库。数据库将从只有有限数量的表开始,每个模块将检查数据库中是否需要它们,如果它们不存在,则创建它们。我怎样才能完成这个?

我考虑过最初只添加我的所有表格,但这似乎打破了我心目中的模块化原则。也许我的想法是错误的,但如果数据库已经完全清楚并且从数据库创建中强烈耦合到给定模块,那么松耦合模块的意义何在?

寻找一些见解。

3 个答案:

答案 0 :(得分:3)

你似乎在问两个问题。第一个是:如何使用PRISM确保数据库中存在模块特定模式,如果不存在,则创建它。第二个问题是:如何最好地构建我的数据层,使其在模块化应用程序中解耦。

要回答关于如何进行模块架构检查的第一个问题,我这样说:

如果您经历过Prism,您无疑会想出几种方法来实现它。与编程中的任何内容一样,有很多方法可以实现它。如果我需要使用Prism执行此操作,我可能会执行以下操作:在我的模块程序集中创建一个类(MyPlugInModule.cs),该类实现Microsoft.Practices.Prism.Modularity.IModule接口。然后我将代码放在构造函数或Initialize方法中,该方法检查数据库以查看模块架构是否存在。如果没有,则创建它。

要回答关于如何最好地构建数据模块化的第二个问题,我这样说:

像Goblin所说,这实际上取决于你想要实现什么类型的模块化。如果您正在销售此应用程序并且您希望将模块作为独立包销售,那么您可能不希望创建数据模型来支持包,直到最终用户付费为止。

您应该能够使用Entity Framework来确保您的模块能够与基本应用程序模块共享实体。此外,根据您的要求,或者您的体系结构是否允许,您可能希望将模型/数据层抽象为与模块不完全对齐的程序集。这将减少代码重复和依赖性。

在我目前正在处理的应用程序上,我们将WPF与MVVM,PRISM与MEF以及WCF数据服务一起使用。我们的客户端模块共享一个数据组件,该组件与位于基本应用程序模型(身份验证/角色表,应用程序数据等)之上的主数据服务端点进行通信。当创建特定于模块域的数据库中的表时,将在服务器上创建新模型和服务端点,并在客户端上创建单独的程序集以与数据模型通信。

如果模块特定模型发生更改,则只需更改受影响的组件,因为模块特定数据封装在其自己的服务和客户端程序集中。从测试,安全性等的隔离角度来看,这是一个更好的选择。当然,缺点是如果基础应用程序模型发生更改,则必须更新所有相关的模块特定实现。

但同样,这实际上取决于您的要求。如果您坚持使用带有MEF,模块化设计模式和实体框架4的PRISM 4,您应该能够提出一个模块化而不紧密耦合的良好解决方案。

答案 1 :(得分:2)

如果您的模块真正独立 - 每个模块的数据库如何?如果你的模块之间需要外键 - 它们本身并没有真正封装 - 我会从一开始就把整个数据库放到一边。更新更容易使架构保持最新状态。

模块化有多种形式 - 业务视角(按模块付费),责任模块化等等。

我的5美分:)

答案 2 :(得分: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
}

在我的一个ViewModel中:

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