Утечка памяти MVC3 IControllerFactory ReleaseController - PullRequest
3 голосов
/ 15 марта 2012

В нашем проекте мы используем MefControllerFactory, это коды, которые мы устанавливаем в application_start в global.asax как ControllerBuilder.Current.SetControllerFactory(new Project.Helper.MefControllerFactory(container));

Проблема в том, что когда мы запускаем .NET Profiler, в результате возникает проблема утечки памяти, даже если мы располагаем контроллеры в методе «ReleaseController». Исходное сообщение: "Экземпляр удален, но все еще доступен из одного или нескольких корней. Поскольку удаленный экземпляр, как правило, больше не должен использоваться, это может указывать на утечку памяти. Исследуйте экземпляр, чтобы выяснить, является ли экземпляр непреднамеренным или если проблема может быть проигнорирована. " Есть ли решение этой проблемы?

Второе сообщение: "Распоряженный экземпляр с прямыми корнями EventHandler Удаляемый экземпляр напрямую коренится в EventHandler, то есть экземпляр используется только как цель EventHandler, и к нему нельзя получить доступ из любого другого корня без прохождения через делегат. Поскольку удаленный экземпляр больше не должен использоваться, а 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;
    }
}

Спасибо ...

1 Ответ

5 голосов
/ 15 марта 2012

Вот основанная на MEF фабрика контроллеров, которую я создал для примеров кода для моей книги :

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 вы можете только освободить графы объектов, выпустив Экспорт - не экспортируется значение .

...