1

在我的应用程序中,我将 StructureMap 与 EntityFramework 一起使用。

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

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

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

IManager服务:

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 
   }
}

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

谢谢

4

1 回答 1

4

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

  1. 完成后显式调用.Dispose()DbContext。您将无法在 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
           }
       }
    }
    
于 2013-04-29T17:25:47.197 回答