在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."

在wcf项目中使用上下文管理正确构建实体框架的结构映射

unitofwork-in- wcm -using-structuremap回答了我应该怎么做。里面还有其他链接,所以请仔细阅读。我不使用uow接口,但自定义生命周期是我最后使用的。

在2.6.4版本的structuremap -最新版本已经改变了一些接口,所以还没有升级。

For<Entities>().LifecycleIs(new WcfInstanceContextLifecycle()).Use(c
=> new Entities());