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) { ... }
ます。解決メソッドにブレークポイントを設定すると、最初にアクセスしたときにまだ例外がスローされるため、部分的に解決されたと言いました。誰かがここで何が起こっているのか知っていますか?
どうもありがとう。