Объясните загадочный мир IoC и автоматического избавления - PullRequest
1 голос
/ 27 июня 2011

Я новичок в ASP.NET MVC, изучаю и экспериментирую с шаблонами корпоративного дизайна: действительно, очень интересные и полезные вещи! Но я все еще что-то упускаю в концепции утилизации ресурсов. Чтобы быть более конкретным, хочу сосредоточиться на механизме controllerFactory, который внедряет в конструктор контроллера реализацию IFuncyRepository или IFuncyService или любой другой «ресурс», который будет использоваться в контроллере (в моем случае я использую StructureMap в качестве IoC).

Мой вопрос: ГДЕ / ЕСЛИ / КАК эти закачанные ресурсы удаляются.

Книга, которой я следую в качестве руководства, - это ASP.NET Design Patterns, и до сих пор я не могу получить никаких объяснений по этому поводу, а также не имею понятия, потому что класс не структурирован, реализуя IDisposable. Похоже, что задача размещения ресурсов выполняется где-то автоматически (может быть, в IoC ??). Поскольку я не могу этого понять, я не могу быть уверен в производительности моего приложения, что вызывает очень досадные сомнения!

Заранее спасибо всем, кто ответит или поделится моей заботой;)

1 Ответ

2 голосов
/ 27 июня 2011

Как правило, создатель одноразового предмета должен также распоряжаться этим же предметом. Таким образом, если вы создаете граф объектов из пользовательского IControllerFactory, вы также должны использовать его ReleaseController для вывода из эксплуатации.

Вот пример использования Castle Windsor:

public class WindsorControllerFactory : DefaultControllerFactory
{
    private readonly IWindsorContainer container;

    public WindsorControllerFactory(IWindsorContainer container)
    {
        if (container == null)
        {
            throw new ArgumentNullException("container");
        }

        this.container = container;
    }

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        return (IController)this.container.Resolve(controllerType);
    }

    public override void ReleaseController(IController controller)
    {
        this.container.Release(controller);
    }
}
...