2013-06-14 2 views
0

Так у меня есть основной контроллер с унаследованным заданного пользователем контроллером с вызовом из DbОпределяется пользователь контроллер (будет inheritted всех контроллеров) с инстанцировано DbContext

public class HomeController : MyAppController 
{ 
    public ActionResult Index() 
    { 
     string name = Db.Users.First().Name; 
     return Content(name); 
    } 
} 

Внутри определенного пользователя контроллера мы имеем

public class MyAppController : Controller 
{ 
    public FooEntities Db { get; set; } 

    public MyAppController() { 
     Db = new FooEntities(); 
    } 
} 

Теперь я слышал, что утечка памяти возможна с помощью этого метода. Как сохранить этот метод и избежать указанных недостатков?

+0

Где вы узнали об этих утечках памяти? Я не думаю, что тебе есть о чем беспокоиться. – qujck

+1

По крайней мере, вы, вероятно, должны переопределить 'Dispose', чтобы избавиться от' Db'. –

+0

Существует переопределение, называемое «Dispose» в контроллере, где вы можете использовать свой контекст, однако я не люблю этот подход, потому что для «чтения» это не имеет особого значения, а «письмо» должно быть ограничено почтовый метод. – Silvermind

ответ

3

Вам может понадобиться расположить контекст:

public class MyAppController : Controller 
{ 
    public FooEntities Db { get; set; } 

    public MyAppController() 
    { 
     Db = new FooEntities(); 
    } 

    protected override void Dispose(bool disposing) 
    { 
     this.Db.Dispose(); 
     base.Dispose(disposing); 
    } 
} 

Но если вы делаете вещи правильно и работать с абстракциями (вместо жесткого кодирования конкретных экземпляров вашего контекста DB в конструктор контроллера), это ответственность ваша инфраструктура зависимостей зависимостей для управления временем жизни вашего контекста. В идеале они должны быть за запрос. В этом случае ваш код контроллера будет выглядеть так:

public class MyAppController : Controller 
{ 
    protected IUnitOfWork UoW { get; private set; } 

    public MyAppController(IUnitOfWork uow) 
    { 
     this.UoW = uow; 
    } 
} 
+0

Интересно. Прежде чем отметить это как ответ. Не могли бы вы рассказать мне о том, что вы упомянули о «за запрос»? –

+0

Это объект, срок службы которого связан со временем HTTP-запроса, то есть он создается в начале запроса и располагается в конце. –

Смежные вопросы