0

Autofac を使用する次のコードに相当する Ninject はありますか。

    public T Create<T>()
    {
        var requestScope =
            container.BeginLifetimeScope(
                builder => builder.RegisterType(typeof(T)).AsSelf());

        var viewModel = requestScope.Resolve<T>();

        lock (viewModelToContainersSyncLock)
        {
            viewModelsToContainers[viewModel] = requestScope;
        }

        return viewModel;
    }
4

1 に答える 1

1

オートファク:

ルート コンテナから開始して、既存のライフタイム スコープで 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 );
  }
}

お役に立てれば。

于 2016-02-25T10:28:25.207 に答える