3

MVC 4 プロジェクトがあり、コントローラーに PerWebRequest オブジェクトを挿入しようとしています。ただし、複数のリクエストでオブジェクトが再作成されていないようです

 private static IWindsorContainer InitializeWindsor()
    {
        var container = new WindsorContainer().Install(FromAssembly.This());

        // Add Factory facility
        container.AddFacility<TypedFactoryFacility>();

        // Register all controllers from this assembly
        foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
        {
            container.Register(
                AllTypes.FromAssembly(assembly).BasedOn<Controller>().Configure(c => c.LifestyleTransient())
                );
        }

        // Register HTTP Handlers
        container.Register(Component.For<HttpRequestBase>().LifeStyle.PerWebRequest.UsingFactoryMethod(() => new HttpRequestWrapper(HttpContext.Current.Request)));
        container.Register(Component.For<HttpContextBase>().LifeStyle.PerWebRequest.UsingFactoryMethod(() => new HttpContextWrapper(HttpContext.Current)));


        // Register components
        container.Register(Component.For<PerWebRequestObject>().LifeStyle.PerWebRequest);
}

ここに私のPerWebRequestObjectがあります:

public class PerWebRequestObject
{
    public DateTime DateCreated { get; set; }

    public PerWebRequestObject()
    {
        DateCreated = DateTime.UtcNow;
        Debug.WriteLine("Created: " + DateCreated.ToLongTimeString());
    }
}

これが私のTestControllerです:

public class TestController : BaseController
{
    public PerWebRequestObject pwrObject { get; set; }

    public ActionResult Test()
    {
        Debug.WriteLine(pwrObject.DateCreated.ToLongTimeString());
        return new ContentResult();
    }
}

なぜこれが機能しないのですか?私は WindsorControllerFactory を使用しており、コントローラーを次のように解放していることに注意してください。

    public override void ReleaseController(IController controller)
    {
        var disposableController = controller as IDisposable;
        if (disposableController != null)
            disposableController.Dispose();

        _windsorContainer.Release(controller);
    }
4

2 に答える 2

5

2つのこと:

  • オブジェクトが適切にライフサイクルされていない(Webリクエスト間で再作成されていない)ことをどのように知っていますか?

考えられる理由の1つは、依存関係が次のようになっていることです。

コントローラ->シングルトン->Webごとのリクエストコンポーネント

これはライフスタイルのミスマッチであり、それはあなたが見ている行動を説明するでしょう

  • コントローラを廃棄しないでください。それがコンテナの仕事です。
于 2012-09-03T21:59:42.360 に答える