Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server Prism模块和数据库_Sql Server_Wpf_Prism - Fatal编程技术网

Sql server Prism模块和数据库

Sql server Prism模块和数据库,sql-server,wpf,prism,Sql Server,Wpf,Prism,我正忙着学习Prism 4和所有东西的来龙去脉,但我还没有看到关于我想要完成什么的教程/演练。希望这里有人曾经或曾经从事过类似的项目 我的应用程序是一个基本的CRUD应用程序,我已将其分解为不同的关注领域,并因此划分为不同的模块。但是,我希望所有模块共享一个通用的本地SQLExpress数据库。数据库将从有限数量的表开始,每个模块将检查数据库中它需要的表,如果它们不存在,则创建它们。我怎样才能做到这一点 我曾考虑过一开始只添加所有表,但这似乎打破了我心目中的模块化原则。也许我的想法是错误的,但是

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

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

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


寻找一些见解

如果您的模块是真正独立的,那么每个模块有一个数据库怎么样?如果您需要模块之间的外键-它们在essense中没有真正封装-我会从一开始就将整个数据库投入使用。更容易在更新之间保持模式最新

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


我的5美分:)

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

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

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

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

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

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

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

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


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

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

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

Bootstrapper.cs文件:

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

这就是你想要的洞察力吗?
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
}