代码之家  ›  专栏  ›  技术社区  ›  Scott

棱镜模块和数据库

  •  3
  • Scott  · 技术社区  · 15 年前

    我正忙着学习棱镜4和所有东西的来龙去脉,但是我还没有看到一个关于我想要完成的事情的教程/介绍。希望这里有人做过类似的项目。

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

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

    寻找一些见解。

    3 回复  |  直到 15 年前
        1
  •  3
  •   BernicusMaximus    15 年前

    你好像在问两个问题。第一个问题是:如何使用棱镜来确保数据库特有的模式存在于数据库中,如果没有,则创建它。第二个问题是:如何最好地构造数据层,以便在模块化应用程序中分离数据层。

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

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

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

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

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

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

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

    但这又取决于你的要求。如果您坚持使用带有MEF、模块化设计模式和实体框架4的PRISM 4,那么您应该能够想出一个很好的解决方案,即模块化而不紧密耦合。

        2
  •  2
  •   Goblin    15 年前

    如果您的模块是真正独立的,那么每个模块一个数据库如何?如果你的模块之间需要外键——它们本质上没有被真正封装——我会从一开始就利用整个数据库。更容易在更新之间保持模式最新。

    模块化有多种风格——业务视角(按模块付费)、责任方面的模块化等等。

    我的5美分:)

        3
  •  0
  •   Garry Polley    9 年前

    此响应适用于任何希望看到连接本地数据库的代码的人。它对我有效,不确定它是否是最佳实践。

    我在用棱镜,我需要让我的数据库工作。这就是我所做的。实体框架似乎“只是工作”把数据库放在某个地方。

    引导程序.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
    }
    

    在我的一个视图模型中:

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