Проблема с IDbConnection и StructureMap - PullRequest
0 голосов
/ 01 августа 2011

В моей процедуре инициализации IContainer настроено следующее:

x.For<IDbConnection>().Use<SqlConnection>().Ctor<string>().Is(MY_SQL_CONNECTION_STRING);

Вот конструктор для моей службы:

private readonly IForumRepository _repo;
public ForumService(IForumRepository repo)
{
    _repo = repo;
}

А вот конструктор для моего хранилища:

private readonly IDbConnection _cn;
public ForumRepository(IDbConnection connection)
{
    _cn = connection;
}

В одной из моих подпрограмм обслуживания я вызываю метод для получения объекта в моем хранилище, а затем, возвращаясь на уровень обслуживания, я вызываю второй метод в своем хранилище - однако при втором вызове хранилища мой Соединение (_cn) больше не имеет связанной с ним строки соединения (похоже, оно стирается при выходе из блока using {} при первом вызове моей службой метода в хранилище.

Вот первый метод, который я вызываю в хранилище.

public Tag GetTag(int id)
{
    Tag o;
    const string q = @"select * from tags where id = @pId";

    using (_cn)
    {
        _cn.Open();
        o = _cn.Query<Tag>(q, new { pId = id }).SingleOrDefault();
    } *** AT THIS POINT THE CONN STRING PROPERTY OF _CN IS CLEARED?!

    return o;
}

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

Может кто-нибудь, пожалуйста, пролить свет на то, где я ошибаюсь?

1 Ответ

2 голосов
/ 02 августа 2011

После завершения блока using используемый объект будет удален. Строка подключения удаляется при утилизации? В любом случае вам, вероятно, не следует использовать объект после его утилизации.

Исходя из кода в вашем посте, я думаю, вы не хотите использовать блок using? Я думаю, что вы захотите вручную закрыть соединение (я думаю, using сделает это автоматически как часть утилизации).

...