2012-03-15 19 views
3

在我們的項目中,我們使用MefControllerFactory,這些都是我們在Global.asax中設定的Application_Start爲ControllerBuilder.Current.SetControllerFactory(new Project.Helper.MefControllerFactory(container));MVC3 IControllerFactory ReleaseController內存泄露

的問題是,當我們運行結果.NET探查的代碼,它給內存泄漏即使我們在「ReleaseController」方法中處理控制器也是一個問題。原始消息是「一個實例被處置,但仍然可以從一個或多個根訪問,因爲通常不再使用已處置的實例,這可能表示內存泄漏。請調查實例以確定實例是否無意中保持活動狀態,或者如果問題可以被忽略。「 有沒有解決這個問題的方法?

第二個信息是: 「直接事件處理器根 甲佈置實例是直接由一個事件處理程序,即,該實例僅作爲一個事件處理程序的目標植根和它不能被從任何到達棄置實例其他的根沒有通過一個委託,因爲不應該使用一個處置的實例,EventHandlers是內存泄漏的常見原因,這個問題是內存泄漏的一個強有力的指示。「

public class MefControllerFactory : IControllerFactory 
{ 
    private CompositionContainer _container; 
    private DefaultControllerFactory defaultControllerFactory; 

    public MefControllerFactory(CompositionContainer container) 
    { 
     _container = container; 
     this.defaultControllerFactory = new DefaultControllerFactory(); 
    } 

    #region IControllerFactory Members 

    public IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName) 
    { 
     IController controller = null; 

     controller = _container.GetExportedValueOrDefault<IController>(controllerName); 

     if (controller == null) 
      return this.defaultControllerFactory.CreateController(requestContext, controllerName); 

     return controller; 
    } 

    public void ReleaseController(IController controller) 
    { 
     IDisposable disposable = controller as IDisposable; 
     if (disposable != null) 
      disposable.Dispose(); 
    } 

    #endregion 


    public System.Web.SessionState.SessionStateBehavior GetControllerSessionBehavior(System.Web.Routing.RequestContext requestContext, string controllerName) 
    { 
     return System.Web.SessionState.SessionStateBehavior.Default; 
    } 
} 

謝謝...

回答

5

下面是基於MEF-器廠我的代碼示例創建了my book

public class MefControllerFactory : DefaultControllerFactory 
{ 
    private readonly CompositionContainer container; 
    private readonly Dictionary<IController, Lazy<object, object>> exports; 
    private readonly object syncRoot; 

    public MefControllerFactory(CompositionContainer container) 
    { 
     if (container == null) 
     { 
      throw new ArgumentNullException("container"); 
     } 

     this.container = container; 
     this.exports = new Dictionary<IController, Lazy<object, object>>(); 
     this.syncRoot = new object(); 
    } 

    protected override IController GetControllerInstance(
     RequestContext requestContext, Type controllerType) 
    { 
     var export = this.container.GetExports(
      controllerType, null, null).Single(); 
     var controller = (IController)export.Value; 
     lock (this.syncRoot) 
     { 
      this.exports.Add(controller, export); 
     } 
     return controller; 
    } 

    public override void ReleaseController(IController controller) 
    { 
     lock (this.syncRoot) 
     { 
      var export = this.exports[controller]; 
      this.exports.Remove(controller); 

      this.container.ReleaseExport(export); 
     } 
     base.ReleaseController(controller); 
    } 
} 

在MEF,你只能通過釋放釋放對象圖導出 - 不是導出的

+0

感謝您回答它的作品... – anilca 2012-03-15 15:18:28