在我的应用程序中,我使用的是带有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
}
}
那么,在这里是否有任何改变来强制部署在结构图中的单例实例中的对象?
由于
答案 0 :(得分:3)
您不会自动处理此对象,因为就您的容器而言,您仍在使用它。这里有两个选择:
完成后,在DbContext上显式调用.Dispose()
。您将无法在Singleton中的任何其他地方使用DbContext,因为该对象现已消失。
不依赖于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
}
}
}