ДИ с одноразовыми предметами - PullRequest
2 голосов
/ 08 марта 2010

Предположим, мой класс хранилища выглядит следующим образом:

class myRepository : IDisposable{
    private DataContext _context;
    public myRepository(DataContext context){
        _context = context;
    }
    public void Dispose(){ 
        // to do: implement dispose of DataContext
    }
}

Теперь я использую Unity для управления временем жизни моего репозитория и контекстом данных и настроил время жизни как:
DataContext - синглтон
myRepository - каждый раз создавать новый экземпляр

Значит ли это, что я не должен реализовывать IDisposable в хранилище для очистки DataContext?

Есть какие-нибудь рекомендации по таким предметам?

EDIT: DataContext - singleton - читать как одиночный веб-запрос

Ответы [ 3 ]

4 голосов
/ 08 марта 2010

Как правило, абстрактные зависимости не должны быть производными от IDisposable , поскольку это будет Leaky Abstraction . Зависимость может содержать или не содержать неуправляемые ресурсы, зависящие от конкретной реализации. В любом случае, контейнер должен управлять временем жизни , поэтому потребителю не нужно это делать - он не знает о времени жизни зависимости: он может быть передан другим потребителям, и в этом случае он будет разрушительным для преждевременной утилизации этого.

Тем не менее, (LINQ to SQL?) DataContext представляет другую проблему, потому что он уже реализует IDisposable, и вы не можете изменить его, потому что он определен в BCL.

Вы можете правильно реализовать IDisposable для своего репозитория, но это означает, что вам придется сопоставить время жизни для всех репозиториев и текста данных.

Другая альтернатива - просто игнорировать то, что вы держитесь за одноразовый ресурс, но если вы это сделаете, вам нужно будет быть абсолютно уверенным , что Unity должным образом избавится от DataContext в соответствующее время - но поскольку вы планируете использовать время жизни Singleton, это не должно быть проблемой.

3 голосов
/ 08 марта 2010

На вашем месте я бы вместо этого использовал реализацию шаблона UnitOfWork или позволил бы контейнеру IOC управлять временем жизни вашего DataContext.

Например, Structuremap имеет опцию HttpContextScoped, поэтому вы регистрируете свой DataContext следующим образом:

For<DataContext>().HttpContextScoped().Use<MyDataContext>();
0 голосов
/ 08 марта 2010

Значит ли это, что я не должен реализовывать IDisposable в хранилище для очистки DataContext?

Звучит так - из того, что вы говорите, все репозитории будут иметь один и тот же DataContext, но первый созданный вами репозиторий будет им распоряжаться.

Что создает DataContext? Что бы это ни было, оно должно избавиться от него.

...