1

次のグローバル フィルターがあります。ISiteValidation と ICacheService は Windsor コンテナーを介して注入され、Transient として設定されているため、コンテナーは依存関係を自動的に破棄しません。これにより、サイトが本番環境に入ったときにリソースの問題が発生します。では、フィルターに注入されたリソースを適切に破棄するために、人々は何をしているのでしょうか? 両方のインターフェイスは IDisposable ですが、Action Filter がスコープ外になったときに Dispose が呼び出されることはなく、コンテナーは引き続き実装を保持します。

public class SiteValidationAttribute : ActionFilterAttribute
{
    public ISiteValidation SiteValidation { get; set; }
    public ICacheService CacheService { get; set; }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.RequestContext.HttpContext.Request.Url != null)
        {
            string host = filterContext.RequestContext.HttpContext.Request.Url.Host;
            try
            {
                string siteId = CacheService.Get("SiteId",
                                                 () =>
                                                 SiteValidation.GetSiteId(
                                                     host));
                var siteIdCookie = new HttpCookie("_site") {Value = siteId};
                filterContext.RequestContext.HttpContext.Response.Cookies.Add(siteIdCookie);
            }
            catch (Exception)
            {
                throw new HttpException(404, String.Format("This site'{0}' was not found", host));
            }
        }

        base.OnActionExecuted(filterContext);
    }
}
4

1 に答える 1

6

属性は、要求に応じて CLR によって作成されます。

属性オブジェクトを作成する場合は、GetCustomAttributes または GetCustomAttribute を呼び出す必要があります。これらのメソッドのいずれかが呼び出されるたびに、指定された属性タイプの新しいインスタンスが構築され、コードで指定された値に基づいてインスタンスの各フィールドとプロパティが設定されます。

これは、IoC コンテナーの制御下にないことを意味します。それらを破棄できるシステムの唯一の部分は、GetCustomAttributeまたはを呼び出している部分ですGetCustomAttributes。しかし、これを明示的に行っているものはありません。その結果、属性を使い捨てにするべきではありません。

幸いなことに、別の方法があります。フィルターに属性を使用するのではなく、必要に応じて (IoC コンテナーによって作成された) フィルターの新しいインスタンスを返すを実装しIActionFilterて登録します。IFilterProvider

Ninject を使用してそれがどのように行われるかを見てください。同じアプローチを Windsor に移植できるはずです。

https://github.com/ninject/ninject.web.mvc/tree/master/mvc3/src/Ninject.Web.Mvc/Filter

于 2012-08-07T13:27:41.283 に答える