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);
}
}
}
答案 0 :(得分:0)
我的解决方案是使用这个nuget包:UnityWCF
服务应该由Unity实例化,每次调用都要实例化。
为此,请使用服务上的此设置:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ...
在您需要的地方注入DbContext。并在Unity中注册如下:
container.RegisterType<DbContext, YourDbContext>(new HierarchicalLifetimeManager(), ...);