【问题标题】:Prism Modules and databases棱镜模块和数据库
【发布时间】:2010-11-16 02:09:16
【问题描述】:

我正忙于学习 Prism 4 以及所有内容的来龙去脉,但我还没有看到关于我想要完成的教程/演练。希望这里有人已经或曾经从事过类似的项目。

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

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

寻找一些见解。

【问题讨论】:

    标签: sql-server wpf prism


    【解决方案1】:

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

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

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

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

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

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

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

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

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

    【讨论】:

    • 这是您正在寻找的洞察力吗?
    【解决方案2】:

    如果您的模块是真正独立的 - 每个模块有一个数据库怎么样?如果您需要模块之间的外键 - 它们本质上并没有真正封装 - 我会从一开始就将整个数据库投入使用。在更新之间使架构保持最新状态要容易得多。

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

    我的 5 美分 :)

    【讨论】:

      【解决方案3】:

      此回复适用于任何想要查看连接本地数据库的代码的人。它对我有用,不确定它是否是最佳实践。

      我正在使用 prism,我需要让我的数据库正常工作。这就是我所做的。实体框架似乎可以“正常工作”将数据库放在某个地方。

      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
      }
      

      【讨论】:

        猜你喜欢
        • 2012-01-04
        • 1970-01-01
        • 2012-01-05
        • 2015-03-05
        • 2018-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多