2

ServiceStack (http://www.servicestack.net) を使って休憩サービスを作っています。データ アクセス レイヤーに作業単位パターンを使用しています。StructureMap を使用して、すべてのサービスと作業単位を一緒に接続しています。

私がしなければならないことは、受け取った個々の要求ごとに 1 つの作業単位を作成し、後でそれを破棄することです。

ここのメカニズムを使用しているWCFサービスがありますhttp://andreasohlund.net/2009/04/27/unitofwork-in-wcf-using-structuremap

本質的にこのような結果になります

ObjectFactory.Initialize(x =>
{
    x.Scan(a =>
        {
             a.AssemblyContainingType<IUnitOfWork>();
             a.WithDefaultConventions();
        });

    x.For<IUnitOfWork>().LifeCycleIs(new WcfOperationLifecycle());
}

ServiceStack の同様の「ライフサイクル」を探しています。

[解決]

解決策は、受け入れられた回答のコメントにあります。

a) StructureMap ライフサイクルを HttpContext に設定する

x.For<IUnitOfWork>().LifecycleIs(Lifecycles.GetLifecycle(InstanceScope.HttpContext));

b) 構造マップ IOC アダプターを更新して、IRelease インターフェイスを拡張しました。

class StructureMapContainerAdapter : IContainerAdapter, IRelease
{
    public T Resolve<T>()
    {
        return ObjectFactory.GetInstance<T>();
    }

    public T TryResolve<T>()
    {
        return ObjectFactory.TryGetInstance<T>();
    }

    public void Release(object instance)
    {
    ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
    }
}
4

1 に答える 1

1

Request Scopeだけが必要なようですね。

また、 Lazy loading +を使用してこの動作を取得する方法については、具体的なService基本クラスを確認してください。Dispose()

ServiceStack の新しい APIと同様に、独自のServiceRunnerOnBeforeExecute() OnAfterExecute()を使用してサービス イベント フックをオーバーライドできます(古い API では、カスタム サービス基本クラスを提供する必要があります)。

于 2012-09-28T14:32:48.990 に答える