2011-02-16 66 views
7

我想确定每个请求结束后结构图是否会处理我的DataContext。StructureMap处理DataContext对象

这里是我的设置

ForRequestedType<MyDataContext>().TheDefault.Is.OfConcreteType<MyDataContext>(); 
SelectConstructor<MyDataContext>(() => new MyDataContext()); 

将structuremap自动处理我的DataContext还是需要手动调用Dispose?

回答

4

不,它不会自动处理它,除非您使用嵌套容器并处理容器中的上下文实例。这取决于上下文的创建者来处理它。创建者通常是代码的一部分,调用ObjectContext.GetInstance<MyDataContext>或使得StructureMap将DataContext注入到其中一个对象中的根方法。

通常的做法是根据HttpRequest创建一个上下文,并在请求结束时处理上下文。

9

这就是我做的:

For<IUnitOfWork>() 
     .HybridHttpOrThreadLocalScoped() 
     .Use<BpReminders.Data.NH.UnitOfWork>(); 

    For<ISession>() 
     .HybridHttpOrThreadLocalScoped() 
     .Use(o => ((BpReminders.Data.NH.UnitOfWork)o.GetInstance<IUnitOfWork>()).CurrentSession); 

和...

protected void Application_EndRequest(object sender, EventArgs e) 
{ 
    ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects(); 
} 

HybridHttpOrThreadLocalScoped使用的HttpContext时可用。

然后,StructureMap会处理所有事情。 只记得在你的课堂上实施IDisposable

+0

尽管在SM中使用HybridHttpOrThreadLocalScoped将使用ThreadLocal存储,但调用ReleaseAndDisposeAllHttpScopedObjects时会引发异常。你能告诉我你是如何设法处理存储在ThreadLocal中的对象的? – Roman 2011-06-23 04:26:30

+0

@Am:你不能使用HybridHttpOrThreadLocalScoped是HttpContextLifecycle的成员。我已经看到ThreadLocalStorageLifecycle(这是你感兴趣的)有一个名为EjectAll的方法。我从来没有用过它,想过,也从来没有真正深入这个。 – LeftyX 2011-06-23 08:31:26