是否有机会重写C#中的SQLite连接打开方法?

是否有机会重写C#中的SQLite连接打开方法?,c#,sqlite,autofac,C#,Sqlite,Autofac,每次打开连接时,我都需要执行SQliteCommand。我将继承SQliteConnection类并使用Autofac注册自定义类,但这种方法对我不起作用。而不是是一种关系使用有一种关系-不要继承SQliteConnection,而是将其封装在类中 像这样的事情应该让你开始: public class DBHelper { private readonly string _connectionString, _sqlToExecut

每次打开连接时,我都需要执行SQliteCommand。我将继承SQliteConnection类并使用Autofac注册自定义类,但这种方法对我不起作用。

而不是
是一种关系使用
有一种关系-不要继承
SQliteConnection
,而是将其封装在类中

像这样的事情应该让你开始:

public class DBHelper
{
    private readonly string _connectionString,
                            _sqlToExecuteOnConnectionOpen;

    public DBHelper(string connectionString)
    {
        _connectionString = connectionString;
        _sqlToExecuteOnConnectionOpen = "Your sql goes here";
    }

    public void ExecuteSql(Action<SQliteConnection> action)
    {
        using(var con = new SQliteConnection(_connectionString))
        {
            using(var cmd = new SQliteCommand(_sqlToExecuteOnConnectionOpen, con)
            {
                con.Open();
                // of course, any parameters goes here...
                cmd.ExecuteNonQuery(); 
            }
            action(con);
        }
    }
}
公共类DBHelper
{
私有只读字符串\u连接字符串,
_sqlToExecuteOnConnectionOpen;
公共DBHelper(字符串连接字符串)
{
_connectionString=connectionString;
_sqlToExecuteOnConnectionOpen=“您的sql在此运行”;
}
public void ExecuteSql(操作)
{
使用(var con=new SQliteConnection(_connectionString))
{
使用(var cmd=new SQliteCommand(_sqlToExecuteOnConnectionOpen,con)
{
con.Open();
//当然,这里有任何参数。。。
cmd.ExecuteNonQuery();
}
行动(con);
}
}
}
现在,您有了一个方法,可以打开和处理
SqliteConnection
的实例,执行预先定义的sql,以及您希望使用该连接执行的任何其他操作

您甚至可以更进一步,将此方法设置为私有,但为ExecuteOnQuery、ExecuteScalar、ExecuteReader甚至填充数据集或数据表公开公共方法,并让它们都执行此方法。 这可以节省使用ADO.Net时通常编写的大量重复的管道代码


事实上,我已经发布了一个与此完全相同的示例(当然,除了您的常量sql语句)-您可以克隆它,查看它的代码,通常只是从中吸取想法并在您自己的代码中实现。

而不是
是一种
关系使用
有一种
关系-不要继承
SQliteConnection
,而是将其封装在类中

像这样的事情应该让你开始:

public class DBHelper
{
    private readonly string _connectionString,
                            _sqlToExecuteOnConnectionOpen;

    public DBHelper(string connectionString)
    {
        _connectionString = connectionString;
        _sqlToExecuteOnConnectionOpen = "Your sql goes here";
    }

    public void ExecuteSql(Action<SQliteConnection> action)
    {
        using(var con = new SQliteConnection(_connectionString))
        {
            using(var cmd = new SQliteCommand(_sqlToExecuteOnConnectionOpen, con)
            {
                con.Open();
                // of course, any parameters goes here...
                cmd.ExecuteNonQuery(); 
            }
            action(con);
        }
    }
}
公共类DBHelper
{
私有只读字符串\u连接字符串,
_sqlToExecuteOnConnectionOpen;
公共DBHelper(字符串连接字符串)
{
_connectionString=connectionString;
_sqlToExecuteOnConnectionOpen=“您的sql在此运行”;
}
public void ExecuteSql(操作)
{
使用(var con=new SQliteConnection(_connectionString))
{
使用(var cmd=new SQliteCommand(_sqlToExecuteOnConnectionOpen,con)
{
con.Open();
//当然,这里有任何参数。。。
cmd.ExecuteNonQuery();
}
行动(con);
}
}
}
现在,您有了一个方法,可以打开和处理
SqliteConnection
的实例,执行预先定义的sql,以及您希望使用该连接执行的任何其他操作

您甚至可以更进一步,将此方法设置为私有,但为ExecuteOnQuery、ExecuteScalar、ExecuteReader甚至填充数据集或数据表公开公共方法,并让它们都执行此方法。 这可以节省使用ADO.Net时通常编写的大量重复的管道代码

事实上,我已经发布了一个完全可以做到这一点的方法(当然,除了您的常量sql语句),您可以克隆它,查看它的代码,通常只需从中获取想法,并在您自己的代码中实现它们。

您可以使用原理拦截
Open
方法

让我们从实现自定义拦截器开始

public class PrepareConnectionInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        if (!(invocation.InvocationTarget is IDbConnection 
              && invocation.Method.Name == nameof(IDbConnection.Open)))
        {
            invocation.Proceed();
            return; 
        }

        invocation.Proceed();
        IDbConnection connection = (IDbConnection)invocation.InvocationTarget;
        using(IDbCommand command = connection.CreateCommand())
        {
            command.CommandText = "SQL statement";
            command.ExecuteNonQuery(); 
        }
    }
}
然后使用autofac注册您的连接和拦截器

builder.RegisterType()
.AsSelf();
builder.RegisterType()
.As()
.EnableInterfaceInterceptors()
.被(类型为(PrepareConnectionInterceptor));
现在,每次在已解析的
IDbConnection
上调用
Open
方法时,将触发拦截器并执行自定义SQL

您可以找到有关

的更多信息。您可以使用principle拦截
打开
方法

让我们从实现自定义拦截器开始

public class PrepareConnectionInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        if (!(invocation.InvocationTarget is IDbConnection 
              && invocation.Method.Name == nameof(IDbConnection.Open)))
        {
            invocation.Proceed();
            return; 
        }

        invocation.Proceed();
        IDbConnection connection = (IDbConnection)invocation.InvocationTarget;
        using(IDbCommand command = connection.CreateCommand())
        {
            command.CommandText = "SQL statement";
            command.ExecuteNonQuery(); 
        }
    }
}
然后使用autofac注册您的连接和拦截器

builder.RegisterType()
.AsSelf();
builder.RegisterType()
.As()
.EnableInterfaceInterceptors()
.被(类型为(PrepareConnectionInterceptor));
现在,每次在已解析的
IDbConnection
上调用
Open
方法时,将触发拦截器并执行自定义SQL


您可以在

上找到更多信息,为什么不使用自己的连接方法来连接并执行此特殊操作,然后调用它。是否可以选择编写“SpecialPen”?查看
StateChange
事件。为什么不使用自己的连接方法进行连接并执行此特殊操作,然后调用它。是否可以选择编写“specialpen”?查看
StateChange
事件。