4

A、B、C の 3 つのコンポーネントがあります。

それらは、次の方法で登録されます。

public class Installer : IWindsorInstaller
{
  public void Install(IWindsorContainer container, IConfigurationStore store)
  {
    container.Register(Component.For<IA>().ImplementedBy<A>());
    container.Register(Component.For<IB>().UsingFactoryMethod(Resolve).LifestyleScoped());
    container.Register(Component.For<IC>().ImplementedBy<C>().LifestyleScoped());
  }

  private static IUnitOfWork Resolve(IKernel kernel)
  {
    IA a = kernel.Resolve<IA>();
    B b = new B(a);
    kernel.ReleaseComponent(a);
    return b;
  }
}

CI を解決するときは、次の方法で行います。

public void Test()
{
  using (ContainerAccessor.Instance.IocContainer.BeginScope())
  {
    using (IB b = containerAccessor.Instance.IocContainer.Resolve<IB>())
    {
      IC c = ContainerAccessor.Instance.IocContainer.Resolve<IC>();
      ...
      b.Commit();

      return result;
    }
}

初めてアクセスすると、「InvalidOperationException: スコープが利用できませんでした。container.BeginScope() を呼び出すのを忘れましたか?」という例外がスローされます。

Resolve メソッドの内容を でラップすることで、部分的に解決しusing (kernel.BeginScope) { ... }ます。解決メソッドにブレークポイントを設定すると、最初にアクセスしたときにまだ例外がスローされるため、部分的に解決されたと言いました。誰かがここで何が起こっているのか知っていますか?

どうもありがとう。

4

0 に答える 0