EntityFramework上下文:Singleton?

时间:2013-01-27 23:51:20

标签: entity-framework-5

我在使用EF5时遇到了一些上下文问题。我还在研究这个问题,但我认为用单例模式实现我的DataContext类是个好主意,以便让不同的实体存储库使用相同的对象。是自杀还是有意义的? 另一个想法是在这里实现一个ContextManager:http://www.codeproject.com/Articles/70061/Architecture-Guide-ASP-NET-MVC-Framework-N-tier-En(但我仍在检查他的代码,我还没有深入理解它。)

您怎么看?

- 编辑 -

在Web应用程序中,我正在为我必须管理的每个实体实现一个存储库

public DataContext : DbContext
{
    //...
}

解决方案1 ​​:很好,但如果我需要在一次调用中进行多次操作,即插入和删除,我会对db进行两次调用,我认为。

public Entity1Repository
{
    public void Add(Entity1 entity)
    {
        using(DataContext context = new DataContext())
        {
            context.Entity1.Add(entity);
            context.SaveChanges();
        }
    }
    public void Delete(Entity1 entity)
    {
        using(DataContext context = new DataContext())
        {
            context.Entity1.Remove(entity);
            context.SaveChanges();
        }
    }
}

解决方案2 :在这种情况下,我想我只有一次调用db,但我需要记得调用Dispose()

public Entity1Repository
{
    private DataContext context;

    public void Add(Entity1 entity)
    {
        context.Entity1.Add(entity);
    }

    public void Save() 
    {
        context.SaveChanges();
    }

    public void Dispose()
    {
        context.Dispose();
    }
}

哪种方法最好? (如果我理解正确,单身人士不是一个好人)

1 个答案:

答案 0 :(得分:0)

我建议您通过构造函数注入(依赖注入)共享dbcontext。

然后我会使用IoC将上下文注入到容器中,每个请求都有生命周期。然后,为Web中的每个请求创建dbcontext,并在该请求期间与每个存储库共享,然后在请求之后处理。

Mark seemann有一本关于依赖注入和实例的好书。 http://www.manning.com/seemann/

希望这有助于您入门。