ブラッドリーBoveinisがこの問題を解決しました。我々は徹底的にテストしていませんが、動作するようです:
public class UnitOfWorkAwareOperationInvoker : IOperationInvoker
{
private readonly IOperationInvoker _baseInvoker;
public UnitOfWorkAwareOperationInvoker(IOperationInvoker baseInvoker)
{
_baseInvoker = baseInvoker;
}
public object[] AllocateInputs()
{
return _baseInvoker.AllocateInputs();
}
public object Invoke(object instance, object[] inputs, out object[] outputs)
{
var result = _baseInvoker.Invoke(instance, inputs, out outputs);
var context = OperationContext.Current.InstanceContext.Extensions.Find<AutofacInstanceContext>();
try
{
context.Resolve<IUnitOfWork>().Save();
}
catch (Exception ex)
{
var message = Message.CreateMessage(MessageVersion.Default, string.Empty);
new ElmahErrorHandler().ProvideFault(ex, null, ref message);
throw;
}
return result;
}
public IAsyncResult InvokeBegin(object instance, object[] inputs, AsyncCallback callback, object state)
{
return _baseInvoker.InvokeBegin(instance, inputs, callback, state);
}
public object InvokeEnd(object instance, out object[] outputs, IAsyncResult result)
{
return _baseInvoker.InvokeEnd(instance, out outputs, result);
}
public bool IsSynchronous
{
get { return _baseInvoker.IsSynchronous; }
}
}
キーが次の行にあります。
OperationContext.Current.InstanceContext.Extensions.Find<AutofacInstanceContext>();
これは、周囲/現在/文脈LifetimeScopeのうち、UOWをつかみます。
私たちがコンテナに 'IUnitOfWork'を登録したとしましょう。どのようにしてサービスコールをラップし、例外が発生していない場合にのみ 'SaveChanges()'を呼び出すことができますか?または、サービスコンストラクタでUoWを使用する必要がありますか? – jgauffin
サービスコールと言ったら、WCFサービスコールを意味しますか?はいの場合、私が上記で提供したリンクは、あなたがそれを行う方法を示しています。唯一の問題は、AutoFacを使用しているときに例外が発生していない場合、UoWのみを保存する方法をまだ見つけていないことです。 –
あなたはそれを自分で言った。「私が後にしているのは、WCFサービスコールの復帰時に作業ユニットの変更をコミットする方法は、明らかに例外がない場合のみです。それは難しい部分で、私が探しているものです。 – jgauffin