Безболезненный способ избавиться от введенного контекста данных LINQ? - PullRequest
1 голос
/ 17 января 2011

Я добавляю новый контекст данных в каждый из моих репозиториев с помощью StructureMap.Жизненный цикл соответствует HTTP-контексту.Но у меня возникли некоторые проблемы с «ошибками приведения к неверному приведению», которые я сузил до «не уничтожения контекстов данных».См. Мой связанный вопрос .

Где мне распоряжаться моим контекстом данных (классом БД), не изменяя каждый метод чтения / записи?Где бы я ни изменял данные, я использовал новый DB () в using(...), поэтому он необходим только для методов IQueryable<xxx> Getxxx(...), но некоторые из них взаимозависимы, поэтому я не хочу, чтобы удаление вызывало DataContext disposed ошибки.

Начальная загрузка:

public class DBServiceRegistry : Registry
{
    public DBServiceRegistry()
    {
        For<DB>().HttpContextScoped().Use(new DB());
        }
    }

Репозиторий:

Этот контекст данных передается в мои репозитории, которые принимают его так:

public class SqlProductRepository : IProductRepository //, IDisposable
{
    private DB _db;

    public SqlProductRepository(DB db)
    {
        _db = db;
    }
    ...
}

Запрос:

public IQueryable<Models.Product> GetProducts()
{
    var products =
        from p in _db.Products
        let images = GetProductImages().WithProductID(p.ProductId)
        select new Models.Product
        {
            ID = p.ProductId,
            ProductCode = p.ProductCode,
            Name = p.Name,
            Description = p.Description,
            Price = p.Price,
            DateModified = p.Date,
            ModelID = p.ModelId,
            Images = new LazyList<Models.ProductImage>(images),
            EditedBy = p.UserId,
            IsTaxable = p.IsTaxable,
            Inventory = p.InventoryStatus,
            Slug = p.Slug
        };

    return products;
}

Я попытался сделать SqlProductRepository IDisposable, но ошибка не исчезла.Как я могу аккуратно утилизировать мои контексты данных (DB) без изменения каждого метода (их много)?

Ответы [ 2 ]

1 голос
/ 17 января 2011

Один из подходов заключается в создании IHttpModule, который перехватывает событие EndRequest (или реализует EndRequest в вашем Global.asax) - он получает контекст БД из вашего контейнера и удаляет его.

0 голосов
/ 16 марта 2011

Решение

Реализация ID, доступная для хранилищ и использования:

For<DB>().HttpContextScoped().Use(() => new DB());

Вместо

For<DB>().HttpContextScoped().Use(new DB());
...