オートファク:
ルート コンテナから開始して、既存のライフタイム スコープで BeginLifetimeScope() メソッドを呼び出すことにより、ライフタイム スコープを作成できます。ライフタイム スコープは破棄可能であり、コンポーネントの破棄を追跡するため、常に「Dispose()」を呼び出すか、「using」ステートメントでラップするようにしてください。
using(var scope = container.BeginLifetimeScope())
{
// Resolve services from a scope that is a child
// of the root container.
var service = scope.Resolve<IService>();
// You can also create nested scopes...
using(var unitOfWorkScope = scope.BeginLifetimeScope())
{
var anotherService = unitOfWorkScope.Resolve<IOther>();
}
}
注入する:
Ninject には 4 つの組み込みスコープがあり、拡張機能を介して提供される他の多くのスコープがあります。
私があなたの質問を理解している限り、あなたが求めている最も合理的なスコープはInScope()です。次に、 .InScope(Func selectScope)メソッドを使用して、独自のスコープを簡単に定義できます。
次に、次のようなものを作成できます。
public class ScopeObject
{ }
public static class ProcessingScope
{
public static ScopeObject Current {get; set;}
}
using Xunit;
public class NinjectCustomScopeExample
{
public class TestService { }
[Fact]
public static void Test()
{
var kernel = new StandardKernel();
kernel.Bind<ScopeObject>().ToSelf().InScope( x => ProcessingScope.Current );
var scopeA = new ScopeObject();
var scopeB = new ScopeObject();
ProcessingScope.Current = scopeA;
var testA1 = kernel.Get<ScopeObject>();
var testA2 = kernel.Get<ScopeObject>();
Assert.Same( testA2, testA1 );
ProcessingScope.Current = scopeB;
var testB = kernel.Get<ScopeObject>();
Assert.NotSame( testB, testA1 );
ProcessingScope.Current = scopeA;
var testA3 = kernel.Get<ScopeObject>();
Assert.Same( testA3, testA1 );
}
}
お役に立てれば。