Распоряжение объектом с внедрением зависимости - PullRequest
4 голосов
/ 03 января 2011

Я создал класс репозитория, который я хочу использовать в коде за страницей. Я использую инъекцию конструктора в код позади страницы, чтобы создать экземпляр хранилища.

Класс репозитория:

BritanniaPremierEntities PBEntities = new BritanniaPremierEntities();

public IQueryable<TradeRoutes> GetRoutes()
{
    var routes = PBEntities.TradeRoutes.OrderBy(c => c.ConsignmentDate);        

    return routes;
}

public IQueryable<TradeRoutes> GetExpiredRoutes()
{
    var routes = PBEntities.TradeRoutes.Where(
        c => c.ConsignmentDate <= System.DateTime.Now);

    return routes;
}

Код за страницей

private IRepository repos;

public Admin_TradeRoutesAdmin()
    : this(new Repository()) 
{
}

public Admin_TradeRoutesAdmin(IRepository repos)
{
    this.repos = repos;
}

public IQueryable GetTradeRoutes()
{        
    // call repository method
    return repos.GetRoutes();
}

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

Ответы [ 2 ]

5 голосов
/ 03 января 2011

Вы должны использовать шаблон Register Resolve Release .

В частности, вы должны помнить, чтобы всегда отпускало то, что вы разрешаете .Композитор обязан следить за тем, должна ли зависимость быть удалена.Это не тривиально , поскольку зависит от различных факторов:

  • Реализует ли зависимость IDisposable?
  • Указывает ли время существования зависимости, что она должна быть удалена сейчас илипозже?

Это такая сложная задача, что вы должны использовать для своей работы надлежащий DI-контейнер .

Однако имейте в виду, что это в конечном итоге зависито том, поддерживает ли ваш DI-контейнер вывод из эксплуатации.Например, Castle Windsor это делает, а StructureMap - нет.

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

В общем, идея в том, что все, что создается контейнером DI, удаляется при условии, что это IDisposable. Единственная проблема - , когда это происходит. Я подозреваю, что между разными контейнерами могут быть различия, но я бы хотел реализовать Dispose() в создаваемом объекте и явно вызвать Dispose() для вводимого объекта.

...