2012-09-28 34 views
2

我正在使用ServiceStack(http://www.servicestack.net)進行休息服務。我爲我的數據訪問層使用工作單元模式。我正在使用StructureMap將我所有的服務和工作單元連接起來。ServiceStack - 工作單元和結構圖

我需要做的是爲我收到的每個單獨的請求創建一個工作單元,然後處理它。

我有一個WCF服務,它使用這裏的機制,http://andreasohlund.net/2009/04/27/unitofwork-in-wcf-using-structuremap

本質導致這樣的事情

ObjectFactory.Initialize(x => 
{ 
    x.Scan(a => 
     { 
      a.AssemblyContainingType<IUnitOfWork>(); 
      a.WithDefaultConventions(); 
     }); 

    x.For<IUnitOfWork>().LifeCycleIs(new WcfOperationLifecycle()); 
} 

我找了ServiceStack類似的「生命週期」。

[解決]

的解決方案是在接受的答案的意見。

a)將StructureMap生命週期的HttpContext

x.For<IUnitOfWork>().LifecycleIs(Lifecycles.GetLifecycle(InstanceScope.HttpContext)); 

二)更新了結構圖IOC適配器來擴展IRelease接口

class StructureMapContainerAdapter : IContainerAdapter, IRelease 
{ 
    public T Resolve<T>() 
    { 
     return ObjectFactory.GetInstance<T>(); 
    } 

    public T TryResolve<T>() 
    { 
     return ObjectFactory.TryGetInstance<T>(); 
    } 

    public void Release(object instance) 
    { 
    ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects(); 
    } 
} 

回答

1

聽起來像是你只是想Request Scope

還可以查看具體的Service基類,瞭解如何使用Lazy loading + Dispose()來獲取此行爲。

還有在ServiceStack's new API您可以使用自己的ServiceRunner(舊的API中,你需要提供定製服務的基類)覆蓋您服務OnBeforeExecute()OnAfterExecute()事件掛鉤。

+0

要使用請求範圍,我必須切換到使用inbuit'Funq',而不是使用結構圖,雖然正確嗎? – John

+1

內置的RequestScope在Funq上,否則只需在'ContainerAdapter'的首選IOC上使用Request Scope。查看維基的底部,瞭解如何將資源釋放回您的IOC中,例如讓你的ContainerAdapter也執行'IRelease' – mythz

+0

我有一些麻煩讓'ServiceRunner'工作。我最終發現,如果你的服務擴展了'RestServiceBase'類,它就不起作用,它只在擴展'Service'類時才起作用。這似乎沒有在任何地方的文檔中提及。 – John