C# 在EF4.0中,静态类获取dbcontext是一种好方法吗?

C# 在EF4.0中,静态类获取dbcontext是一种好方法吗?,c#,asp.net-mvc-2,entity-framework-4,C#,Asp.net Mvc 2,Entity Framework 4,我想知道创建一个静态类来获取实体数据库上下文是否是一个好的实践 这GetEntity()返回上下文。在GetEntity方法中,我有一个动态连接。 当有人进入我的登录页面时,他们需要提供一个数据库号+用户名+密码。我将dbname存储在会话[“dbname”]中 当我想在控件中通过示例获取DBContext时,我只需要执行EntityFactory.GetEntity(),这将返回一个DB上下文 我这样做对吗 如果20个客户端同时使用不同的数据库名登录,则可能会出现问题 目前,我没有使用任何di

我想知道创建一个静态类来获取实体数据库上下文是否是一个好的实践

GetEntity()
返回上下文。在
GetEntity
方法中,我有一个动态连接。 当有人进入我的登录页面时,他们需要提供一个数据库号+用户名+密码。我将dbname存储在
会话[“dbname”]

当我想在控件中通过示例获取DBContext时,我只需要执行
EntityFactory.GetEntity()
,这将返回一个DB上下文

  • 我这样做对吗
  • 如果20个客户端同时使用不同的数据库名登录,则可能会出现问题
  • 目前,我没有使用任何dispose,这有问题吗?基于我的
    EntityFactory
    类,我可以在该类中生成一个将自动调用的全局可丢弃。(我想到了descrutor方法)
  • 为了:

  • 您可以通过将所需的所有信息(如数据库名、用户名和密码)传递到
    GetEntity()
    来改进它。现在,静态方法与会话紧密耦合。将会话从方法中移出

  • 不应该这样做,因为会话是按用户的

  • 如果
    DBEntities
    继承自
    DbContext
    ,则可以在使用对象后调用Dispose。Es:
    dbEntitiesObj.Dispose()


  • 静态
    工厂方法很难模拟单元测试。从控制器中的示例来看,如果您有:

    public void SomeControllerMethod()
    {
        var entities = EntityFactory.GetEntity();
        return entities.Something // ... get whatever data...
    }
    
    那么,您将如何在单元测试中使用模拟数据上下文?这很难做到。 最好将上下文“注入”到控制器中,通常是通过构造函数(如果您不熟悉该概念,请阅读关于“”的Wikipedia文章),如:

    然后让控制器方法使用传入的引用。通过这种方式,您可以使用依赖项注入工具来获取适当的db上下文,或者在模拟上下文中传递

    我不确定MVC2是否有一个添加依赖注入框架的好方法,但我知道MVC3有

    你的方法也很有效,根本没有什么问题,只是看起来很难测试。当然,如果您不进行任何单元测试,也不需要使用模拟数据存储,那么我想这真的不重要:)


    我通常首先使用带有EntityFramework代码的MVC3,结果非常好,你可以用List模拟大多数数据层,而不是实际的数据库,你可以“加载”和“保存”记录到内存列表中,而决不接触真实的数据库。

    @Eranga非常感谢你的编辑,我的英语不好:)
    public void SomeControllerMethod()
    {
        var entities = EntityFactory.GetEntity();
        return entities.Something // ... get whatever data...
    }
    
    public class SomeController
    {
        private readonly IDBEntities entities;
    
        // db context passed in through constructor,
        // to decouple the controller from the backing implementation.
        public void SomeController(IDBEntities entities)
        {
            this.entities = entities;
        }
    }