在wcf项目中使用上下文管理正确构建实体框架的结构映射
本文关键字:实体 构建 框架 映射 结构 管理 项目 wcf 上下文 | 更新日期: 2023-09-27 18:05:26
我已经阅读了关于这个的其他帖子,并在网上加载,但我仍然不确定我所拥有的是否完全正确…
我已经使用servicehostfactory在适当的服务中初始化StructureMap。(基于此)下面的片段. .
public class StructureMapServiceHostFactory : ServiceHostFactory
{
public StructureMapServiceHostFactory()
{
Bootstrapper.ConfigureDependencies();
}
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
return new StructureMapServiceHost(serviceType, baseAddresses);
}
}
和bootstrapping.
public static IContainer ConfigureDependencies()
{
if (AlreadyRegistered)
{
return ObjectFactory.Container;
}
lock (_lockThis)
{
if (AlreadyRegistered)
{
return ObjectFactory.Container;
}
BootstrapStructureMap();
AlreadyRegistered = true;
}
return ObjectFactory.Container;
}
public static void BootstrapStructureMap()
{
ObjectFactory.Initialize(x =>
{
x.AddRegistry<InfrastructureRegistry>();
});
}
public class InfrastructureRegistry : Registry
{
public InfrastructureRegistry()
{
For<Entities>().HybridHttpOrThreadLocalScoped().Use(c => new Entities());
…
注册我的实体框架上下文是HybridHttpOrThreadLocalScoped。在Application_EndRequest中,我正在释放http作用域对象,它应该只是db上下文,因为这是我想要的每个服务请求。
protected void Application_EndRequest(object sender, EventArgs e)
{
Bootstrapper.ReleaseAndDisposeAllHttpScopedObjects();
}
public static void ReleaseAndDisposeAllHttpScopedObjects()
{
ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
}
这是正确的方法还是我错过了什么?这样,我就不需要在上下文周围使用using语句,因为它应该限定在该请求的范围内,并且下一个请求将获得另一个。
主要原因是,有时,当我访问实体上的子对象时,对象是空的,而它不应该是空的,我试图消除它可能是共享上下文的事实。
我试图写出Application_EndRequest的上下文
var instance = StructureMap.ObjectFactory.GetInstance<AXA_Entities.Entities>(); - write to file then
和hashCode是唯一的,但调用GetInstance将得到我一个新的实例,每次我可以想象吗?
我想我是接近这个,但我可能错过的东西的解释是赞赏。
理想情况下,我希望我的范围是这样的。
For<Entities>().HttpContextScoped().Use(c => new Entities());
,但我得到以下方法作为结果。
"StructureMap Exception Code: 309'nYou cannot use the HttpContextLifecycle outside of a web request. Try the HybridLifecycle instead."
unitofwork-in- wcm -using-structuremap回答了我应该怎么做。里面还有其他链接,所以请仔细阅读。我不使用uow接口,但自定义生命周期是我最后使用的。
在2.6.4版本的structuremap -最新版本已经改变了一些接口,所以还没有升级。
For<Entities>().LifecycleIs(new WcfInstanceContextLifecycle()).Use(c
=> new Entities());