Используя Unity и интерфейсы, как мне создать конкретный класс, который реализует IDisposable - PullRequest
0 голосов
/ 11 марта 2010

У меня есть интерфейс (IDbAccess) для класса доступа к базе данных, чтобы я мог тестировать его с помощью Unity. В Unity все работает нормально, и теперь я хочу, чтобы конкретный класс базы данных реализовал IDisposable, чтобы он закрывал соединения с БД.

Моя проблема в том, что Unity не понимает, что мой конкретный класс одноразовый, потому что интерфейс (IDbAccess) не может реализовать другой интерфейс.

Так как я могу написать такой код (псевдокод), чтобы Unity знала, что ему нужно избавиться от класса, как только я закончу?

Using var MyDbAccessInstance = Unity.Resolve<IDbAccess>
{
}

Спасибо

Ryan

1 Ответ

1 голос
/ 12 марта 2010

Теоретически можно создать новый интерфейс IMyDbAccess, который наследует как IDisposable, так и IDbAccess. Так что-то вроде

public interface IMyDbAccess : IDbAccess, IDisposable
{
}

public class MyClass : IMyDbAccess
{
    // Stuff from IDbAccess

    public void Dispose()
    {
    }
}

Позвольте вам:

IUnityContainer unityContainer = new UnityContainer();

using (var bob = unityContainer.Resolve<IMyDbAccess>())
{
    // something
}

Не забудьте изменить свой менеджер времени жизни на ExternallyControlledLifetimeManager при регистрации типа, чтобы контейнер имел слабую ссылку на класс.

...