1

最近、ASP.NET MVC プロジェクトの 1 つに Autofac 2.6.2 を追加しました。

問題に直面しています。WebDataContext を解決したいときに、ObjectDisposedException があります。

Instances cannot be resolved and nested lifetimes cannot be
created from this LifetimeScope as it has already been disposed.

インデックス ページを呼び出すと、ブラウザーは、インデックス ページと必要な他のすべてのリソース (css、js など) を取得するために多くの要求を送信します。これらの要求の 1 つが IWebDataContext を解決でき、他のすべての要求は ObjectDisposedException をスローします。

したがって、私のコードは次のようになります。

protected void Application_Start()
{
    MyContext.Initialize();
    DependencyResolver.SetResolver(new AutofacDependencyResolver(MyContext.Container));
    [...]
}

public class MyContext
{
    public static IContainer Container { get; set; }

    public static void Initialize()
    {
        ContainerBuilder container = new ContainerBuilder();
        IDependencyRegistrar registrar = new DependencyRegistrar();
        registrar.Register(container);
        MyContext.Container = container.Build();
    }

    public static IEngine Engine
    {
        get { return Singleton<IEngine>.Instance; }
    }
}

public class DependencyRegistrar : IDependencyRegistrar
{
    public void Register(object containerBuilder)
    {
        ContainerBuilder builder = (ContainerBuilder)containerBuilder;
        builder.RegisterControllers(Assembly.GetExecutingAssembly());
        builder.RegisterType<WebDataContext>().As<IWebDataContext>().InstancePerHttpRequest();
            [...]
}

そして最後に、登録した依存関係を解決する方法:

public class MyEngine : IEngine
{
    public T Resolve<T>() where T : class
    {
        return DependencyResolver.Current.GetService<T>();
    }
}

私が思うに: 1 つのスレッドが WebDataContext を破棄し、他のすべてのスレッドがアクセスできなくなります。私が何かを忘れていて、私のコードがスレッドセーフであるかどうかを誰かに教えてもらえますか?

4

1 に答える 1

4

私は問題を見つけました。autofacがそのリソースを前に破棄するために不可能なことをApplication_ErrorイベントでResolveメソッドを呼び出していました!

于 2012-06-22T14:36:56.753 に答える