Когда вызывать Dispose в Entity Framework? - PullRequest
1 голос
/ 01 мая 2010

В моем приложении я использую Spring.Net для IoC. Сервисные объекты вызываются из файлов ASP.Net для выполнения операций CRUD с использованием этих сервисных объектов. Например, у меня есть CustomerService для выполнения всех операций CRUD на таблице Customer. Я использую Entity Framework, и объекты вводятся. Мой вопрос: где я могу вызвать метод dispose?

Насколько я понял из документации API, если я не вызову Dispose (), гарантии нет, это будет сбор мусора! Так где и как мне это сделать?

Пример класса обслуживания:

 public class CustomerService
{
    public ecommEntities entities = {get; set;}

    public bool AddCustomer(Customer customer)
    {
        try
        {
            entities.AddToCustomer(customer);
            entities.SaveChanges();
            return true;
        }
        catch (Exception e)
        {
            log.Error("Error occured during creation of new customer: " + e.Message + e.StackTrace);
            return false;
        }            
    }

    public bool UpdateCustomer(Customer customer)
    {
        entities.SaveChanges();
        return true;
    }

public bool DeleteCustomer(Customer customer)
.
.
.   

И я просто создаю объект CustomerService в частичном классе ASP и вызываю необходимые методы.

Заранее благодарим за лучшую практику и идеи ..

С уважением,

Абдель Раоф

Ответы [ 2 ]

2 голосов
/ 03 мая 2010

@ LukLed обычно правильно (+1), что HTTP-запрос является правильной областью. Тем не менее, я очень сомневаюсь, что для вызова Dispose() с NInject или Spring.Net требуется явный код, поскольку оба они уже должны располагать экземплярами, которыми они управляют. HttpContext.Current является таким же хорошим местом для хранения ссылок, как и все остальное.

Однако вы (@Abdel) не правы:

Насколько я понял из документации API, если я не вызову Dispose (), нет гарантии, что это будет сбор мусора!

Это просто не правильно. Dispose() делает коллекцию несколько более оптимальной и обеспечивает детерминированное освобождение неуправляемых ресурсов (например, подключение к вашей БД). Но все будет в конечном итоге собрано, с или без вызова Dispose().

2 голосов
/ 02 мая 2010

В моем приложении есть HttpModule, который заботится о создании и удалении контекста:

public class MyEntitiesHttpModule : IHttpModule
{
    public void Init(HttpApplication application)
    {
        application.BeginRequest += ApplicationBeginRequest;
        application.EndRequest += ApplicationEndRequest;
    }

    private void ApplicationEndRequest(object sender, EventArgs e)
    {
        if (HttpContext.Current.Items[@"MyEntities"] != null)
            ((MyEntities)HttpContext.Current.Items[@"MyEntities"]).Dispose();
    }

    private static void ApplicationBeginRequest(Object source, EventArgs e)
    {
        //TextWriter logFile = File.CreateText(HttpContext.Current.Server.MapPath("~/sqllogfile.txt"));
        var context = new MyEntities();
        //context.Log = logFile;
        HttpContext.Current.Items[@"MyEntities"] = context;
    }
}

Создает его в начале запроса и удаляет в конце. Контекст взят из HttpContext.Current.Items Ninject и введен в мой сервисный объект. Я не знаю, как именно это работает с Spring.Net и каков ваш подход к созданию ObjectContext, но я надеюсь, что этот ответ поможет. Если Sprint.Net поддерживает время жизни каждого запроса и не нуждается в каких-либо модулях, он, вероятно, также позаботится об утилизации. В другом случае вы можете сделать это как здесь.

...