1

第一次问问题,老读者。

我们有一个新应用程序,它大量使用 MEF 和 DI(通过构造函数参数注入)来处理对象实例化。我们正在努力解决的一个领域是 EF 上下文创建。要创建 EF 上下文,您需要一个 conn 字符串(例如,在 app.config 中)。但是我们的应用程序让用户在启动时提供服务器/数据库(以及用户名/密码)。所以问题是我们如何使用 MEF 用默认的 conn 字符串实例化 EF 上下文,然后在登录后用用户提供的值替换 conn 字符串,然后在 MEF 容器中更新它?

到目前为止,我们处理它的唯一方法是在 LoginViewModel 中使用 IoC.Get 类型调用将现有实体对象拉出容器,然后将其连接字符串设置为新值。然后,MEF 使用这个新字符串向前移动,并在我们将上下文注入应用程序时自动创建/处置上下文。

令人担忧的是这种服务定位器的气味(并且发生在组合根之外)以及其他问题,例如 MEF + DI + 容器使用。许多评论者指出,盲目地坚持某种模式是灾难的根源。问题是这是否是处理这种情况的适当方法?我们应该使用创建的抽象工厂,然后使用它来创建上下文吗?

当在应用程序的引导部分中创建上下文并因此在登录时提供新的连接字符串时已经实例化时,如何替换 EF 的连接字符串?MEF 通常会重复创建/处理上下文 - 那么如何设置新的 conn 字符串?我们使用共享策略创建上下文部分,因此理论上只有一个并且永远不会被破坏,因此只需更新 conn 字符串就可以了。

4

1 回答 1

1

我们的多租户基于 MVC Azure 的应用程序遇到了类似的情况,我们通过导出一种方法来解决,该方法从请求数据库操作的用户的活动会话中获取当前连接字符串

从 MVC 会话详细信息中导出方法抽象 DbContext,只需在 DbContext 或 IRepository 实现中导入导出的方法。

不要使用属性导出,当属性导出时,它的值由 MEF 保存,并且不会获取存储在活动会话中的当前值。方法导出将使您能够获取存储在活动会话中的连接字符串的当前值。

如果您需要更多说明,请告诉我。

于 2013-10-13T19:14:45.203 回答