我正在使用ServiceStack(http://www.servicestack.net)制作休息服务。我正在为数据访问层使用工作单元模式。我正在使用StructureMap将所有服务和工作单元连接在一起。
我需要做的是为我收到的每个请求创建一个工作单元,然后在之后处理它。
http://andreasohlund.net/2009/04/27/unitofwork-in-wcf-using-structuremap,我有一个 WCF 服务,它正在使用这里的机制。
本质上导致这样的事情
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));
b) 更新了结构图 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();
}
}
听起来你只是想要请求范围?
另请查看具体的 Service 基类,了解如何使用延迟加载 + Dispose()
来获取此行为。
以及在ServiceStack的新API中,您可以使用自己的ServiceRunner覆盖服务OnBeforeExecute()
OnAfterExecute()
事件钩子(在较旧的API中,您需要提供自定义服务基类)。