棱镜模块和数据库

3

我正忙于学习Prism 4以及相关的一切,但是我还没有看到关于我想要实现的教程/步骤。希望这里有人已经或正在处理类似的项目。

我的应用程序是一个基本的CRUD应用程序,我已将其分解为不同的关注点区域和模块。然而,我希望所有模块共享一个公共的本地SQL Express数据库。数据库将从最初的有限数量的表开始,并且每个模块都会检查它所需的表是否存在于数据库中,如果不存在,则创建它们。我该如何实现这一点?

我曾考虑过最初添加所有我的表,但这似乎在我的脑海中破坏了模块化原则。也许我的想法是错误的,但如果数据库已经完全知道并与给定模块强耦合从db创建开始,那么松散耦合的模块的意义何在呢?

寻求一些见解。

3个回答

3
您似乎在问两个问题。第一个问题是:如何使用PRISM确保我的模块特定架构存在于数据库中,如果不存在,则创建它。第二个问题是:如何最好地构建我的数据层,使其在模块化应用程序中解耦。
回答您的第一个关于如何进行模块架构检查的问题,我这样说:
如果您一直在使用Prism,毫无疑问会想出几种方法来实现它。与编程中的任何事物一样,有许多方法可以实现它。如果我需要使用Prism来做到这一点,我可能会执行以下操作:在我的模块程序集中创建一个类(MyPlugInModule.cs),该类实现Microsoft.Practices.Prism.Modularity.IModule接口。然后,我将在构造函数或Initialize方法中放置代码,以检查数据库是否存在模块架构。如果不存在,则创建它。
回答您关于如何最好地构建数据模块化的第二个问题,我这样说:
就像Goblin所说的,这实际上取决于您要实现的模块化类型。如果您正在销售此应用程序,并且希望将模块作为独立包销售,则可能不希望在最终用户付款之前创建支持包的数据模型。
您应该能够使用Entity Framework确保您的模块能够共享基本应用程序模块的实体。此外,根据您的要求或者如果您的架构允许,您可能希望将模型/数据层抽象为与您的模块不完全对齐的程序集。这将减少代码重复和依赖项。
在我目前正在工作的应用程序上,我们使用WPF与MVVM、PRISM与MEF以及WCF数据服务。我们的客户端模块共享一个数据程序集,该程序集与我们的主数据服务端点通信,该端点位于基础应用程序模型(身份验证/角色表、应用程序数据等)之上。当创建特定于模块领域的表时,在服务器上创建新的模型和服务端点,并在客户端上创建单独的程序集以与数据模型通信。
如果模块特定模型发生更改,则只需更改受影响的组件,因为模块特定数据封装在其自己的服务和客户端程序集中。从测试、安全性等方面来看,这是一种更好的隔离选项。当然,缺点是如果基础应用程序模型发生更改,则必须更新所有相关的模块特定实现。
但是,这真的取决于您的要求。如果您坚持使用PRISM 4与MEF、模块化设计模式和实体框架4,您应该能够得出一个既模块化又不紧密耦合的好解决方案。

这是你正在寻找的洞见吗? - BernicusMaximus

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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接