用于EF DbContext的WCF自定义OperationConext Lifetimemanager

时间:2016-12-22 19:19:23

标签: c# entity-framework wcf unity-container

 container.RegisterType<IDataContextFactory<MyDataContext>, DefaultDataContextFactory<MyDataContext>>(new PerRequestLifetimeManager());

使用OperationContext创建一个PerRequestLifetimeManager,但它似乎根本不调用setValue函数,它总是试图转到GetValue()函数,它总是重新为null,因为没有设置任何东西。

我的目标是为dbconetxt创建一个lifetimeManager,它将为每个方法调用提供一个新的dbContext。瞬态不是一个选项,因为它赢了; t适用于连接查询。

 public class WcfOperationContext : IExtension<OperationContext>
    {
        private readonly IDictionary<string, object> items;

        private WcfOperationContext()
        {
            items = new Dictionary<string, object>();
        }

        public IDictionary<string, object> Items
        {
            get { return items; }
        }

        public static WcfOperationContext Current
        {
            get
            {
                WcfOperationContext context = OperationContext.Current.Extensions.Find<WcfOperationContext>();
                if (context == null)
                {
                    context = new WcfOperationContext();
                    OperationContext.Current.Extensions.Add(context);
                }
                return context;
            }
        }

        public void Attach(OperationContext owner) { }
        public void Detach(OperationContext owner) { }
    }

    public class PerRequestLifetimeManager : LifetimeManager
    {
        private string key;

        public PerRequestLifetimeManager()
        {
            key = Guid.NewGuid().ToString();
        }

        public override object GetValue()
        {
            if (WcfOperationContext.Current == null)
            {
                return null;
            }
            else
            {
                return WcfOperationContext.Current.Items[key];
            }
        }

        public override void RemoveValue()
        {
            if (WcfOperationContext.Current != null)
            {
                WcfOperationContext.Current.Items.Remove(key);
            }
        }

        public override void SetValue(object newValue)
        {
            if (WcfOperationContext.Current != null)
            {
                WcfOperationContext.Current.Items.Add(key, newValue);
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

我的解决方案是使用这个nuget包:UnityWCF

服务应该由Unity实例化,每次调用都要实例化。

为此,请使用服务上的此设置:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ...

在您需要的地方注入DbContext。并在Unity中注册如下:

container.RegisterType<DbContext, YourDbContext>(new HierarchicalLifetimeManager(), ...);