Есть ли простой способ использовать Injection Dependency для моих подключений? - программирование
Подтвердить что ты не робот

Есть ли простой способ использовать Injection Dependency для моих подключений?

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

Может ли кто-нибудь дать мне предложение?

4b9b3361

Ответ 1

Я использую NInject для выполнения инъекций зависимостей моих проектов. Я обычно заканчиваю конфигурацию ниже:

Простой интерфейс Factory

public interface IDbConnectionFactory
{
    IDbConnection CreateConnection();
}

Factory Реализация

public class SqlConnectionFactory : IDbConnectionFactory
{
    private readonly string _connectionString;

    public SqlConnectionFactory(string connectionString)
    {
        _connectionString = connectionString;
    }

    public IDbConnection CreateConnection()
    {
        var conn = new SqlConnection(_connectionString);
        conn.Open();
        return conn;
    }
}

NInject Config:

Bind<IDbConnectionFactory>()
    .To<SqlConnectionFactory>()
    .WithConstructorArgument("connectionString",
ConfigurationManager.ConnectionStrings["SqlConnection"].ConnectionString);

Пример репозитория:

public class UserRepository : IUserRepository
{
    private readonly IDbConnectionFactory _dbConnectionFactory;

    public UserRepository(IDbConnectionFactory dbConnectionFactory)
    {
        _dbConnectionFactory = dbConnectionFactory;
    }

    public IEnumerable<User> List()
    {
        using (var dbConnection = _dbConnectionFactory.CreateConnection())
        {
            ....
        }
    }
}

Изменить: я всегда позволяю ADO.NET заботиться о пуле соединений. Поэтому я открываю и закрываю соединение каждый раз, когда мне нужно выполнить операцию с базой данных.

Этот подход работает для меня и очень прост, как вы упомянули в своем вопросе.

Ответ 2

Ввести класс оболочки:

class ConnectionProvider { public SqlConnection Get() { ... } }

Вы можете добавить к нему интерфейс, если хотите.

Используя этот шаблон, вы также можете ввести строку подключения, если хотите:

class ConnectionStringProvider { public string Get() { ... } }