8

我看到如下代碼中的EF code firstMVCStructureMap教程創建Context Per Request模式:是StructureMap HttpContextScoped必要的嗎?

protected void Application_Start() 
    { 
     ... 

     initStructureMap(); 

    } 

    private static void initStructureMap() 
    { 

     ObjectFactory.Initialize(x => 
     { 
      x.For<IUnitOfWork>().HttpContextScoped().Use(() => new Context()); 
      x.For<IFirstEntity>().Use<FirstEntity>(); 
      x.For<ISecondEntity>().Use<SecondEntity>(); 
      x.For<IThirdEntity>().Use<ThirdEntity>(); 
     }); 

     ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory()); 
    } 

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


public class StructureMapControllerFactory : DefaultControllerFactory 
{ 
    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 
     return ObjectFactory.GetInstance(controllerType) as Controller; 
    } 
} 

FirstEntitySecondEntity和......都需要IunitOfWork在其構造。

正如你所看到的,只是使用HttpContextScoped()代替Context而不是其他代碼,在EndRequest事件中它調用ReleaseAndDisposeAllHttpScopedObjects()

1-這是一個正確的方法?

2-我應該使用HttpContextScoped()爲所有其他Service layer Interfaces或不只是爲IUnitOfWork? e.g

x.For<IFirstEntity>().Use<FirstEntity>(); 

x.For<IFirstEntity>().HttpContextScoped().Use(() => new FirstEntity()); 

3- ReleaseAndDisposeAllHttpScopedObjects()處置所有實例或只是處置Context

回答

8

Web應用程序的約定是,您在整個http請求期間保持相同的ORM上下文/ UnitOfWork。這是爲了在請求期間處理相同的實體,保持數據的一致性並最小化所做的數據庫調用。 HttpContextScoped生命週期確保在請求具有依賴關係的所有實例的過程中使用相同的UoW實例。

所以,1)是的,這是正確的

關於「服務層接口」的其餘部分,這取決於它是否需要整個請求時是相同的實例。問問自己:「在整個請求過程中是否需要此對象的狀態?」?對於大多數「服務」而言,情況並非如此。另外請注意,製作一些「HttpContextScoped」也會使它的所有依賴關係在該範圍內停留。

這使我說2)在大多數情況下,沒有

ReleaseAndDisposeAllHttpScopedObjects處置與HttpContextScoped註冊的容器中的所有對象。默認情況下,對象在Structuremap中被定義爲transient(每次調用的新實例)。

所以3)只要IUnitOfWork實例將被丟棄。

+0

我更新了問題2 –

+0

已更新的回答。除非需要保持相同的狀態,否則創建實例的成本很高,並且可以在請求期間共享狀態,請使用瞬態對象。 – PHeiberg

+0

謝謝,我的問題是當這些實例將被處置?他們是否也在EndRequest中處理? –