在单例类中处理实体框架dbcontext(StructureMap)

时间:2013-04-29 16:38:26

标签: entity-framework singleton structuremap dispose dbcontext

在我的应用程序中,我使用的是带有EntityFramework的StructureMap。

好吧,我的ioc配置看起来像:

x.For<IDbContext>().Use(c => new DbContext(AppSettings.ConnectionString));
x.For<IManager>().Singleton().Use<DefaultManagerImplementation);
x.For<IManagerService>().Use<DefaultManagerServiceImplementation>();

我的问题是关于处理DbContext实例,在IManagerService中使用它。

IManagerService:

using(var ctx = new DbContext(AppSettings.ConnectionString)
{
   // works fine
   ctx. 
   ctx.save();
}


public class ManagerService : IManagerService
{
   private readonly IDbContext _dbContext;

   public ManagerService(IDbcontext dbContext)
   { 
      // not works, because DbContext is not disposed? 
      _dbContext = dbContext; // inject
      ...
      _dbContext.Get... return old data 
   }
}

那么,在这里是否有任何改变来强制部署在结构图中的单例实例中的对象?

由于

1 个答案:

答案 0 :(得分:3)

您不会自动处理此对象,因为就您的容器而言,您仍在使用它。这里有两个选择:

  1. 完成后,在DbContext上显式调用.Dispose()。您将无法在Singleton中的任何其他地方使用DbContext,因为该对象现已消失。

  2. 不依赖于DbContext,而是依赖于Func<DbContext>(或其他一些工厂界面)。我不确定StructureMap,但只要你注册了T,其他IoC容器就会自动处理Func,因此不需要任何新的依赖项。这会将您的构造函数更改为以下内容:

    public class ManagerService : IManagerService
    {
       private readonly Func<IDbContext> _dbContextFactory;
    
       public ManagerService(Func<IDbContext> dbContextFactory)
       { 
           _dbContextFactory = dbContextFactory; // inject
           using (var context = _dbContextFactory())
           {
              ...
               // Do stuff with your context here
           } // It will be disposed of here
    
           using (var context = _dbContextFactory()) 
           {
              // ...and here's another context for you
           }
       }
    }