我在我的WCF服务中遇到了这个问题。“在从池中获取连接之前超时时间已过”
现在我理解了这个错误,我的问题是,使用Ninject管理WCF服务中的Sql连接的正确方法是什么。
我所做的是这样的。在绑定中,我有
Bind<IConnectionFactory>().To<ConnectionFactory>().InScope(c => OperationContext.Current);我的连接工厂看起来像这样。
public class ConnectionFactory : IConnectionFactory
{
private string connectionString = ConfigurationManager.ConnectionStrings["SqlConnection"].ConnectionString;
private SqlConnection sqlConnection;
public SqlConnection GetOpenConnection()
{
if (sqlConnection == null)
sqlConnection = new SqlConnection(connectionString);
if (sqlConnection.State != ConnectionState.Open)
sqlConnection.Open();
return sqlConnection;
}
public void CloseConnection()
{
sqlConnection.Close();
}每当我需要一个Sql连接时,我都会通过一个IoC容器调用它,如下所示。
SqlConnection connection = IoC.Resolve<IConnectionFactory>().GetOpenConnection();我的假设是,每当我处理相同的请求时,我都会从Ninject获得相同的连接,并且该请求生命周期内的所有连接调用都将获得相同的连接。基于这个错误,我假设这不会发生。有没有更好的方法来做这件事?或者,对于使用ninject的WCF来说,更好的连接管理范例是什么?我觉得让连接工厂成为单例是错误的,但这只是我的直觉。
编辑:我想添加我将连接注入到我的存储库,如下所示
private readonly SqlConnection connection;
public RandomRepository(IConnectionFactory connectionFactory)
{
connection = connectionFactory.GetOpenConnection();
}发布于 2012-07-08 23:30:58
嘿,你可以安装Ninject.Extensions.WCF,这为你提供了合适的服务范围。然后,您可以直接将SqlConnection注入到您的类中,而不必使用连接工厂。只需使用具有适当作用域的方法绑定。例如,使用call作用域:
Bind<ISqlConnection>().ToMethod(ctx => ctx.Kernel.Get<IConnectionFactory>().GetOpenConnection()).InCallScope();然后,当你的请求超出作用域时,Ninject会处理掉这个连接。
https://stackoverflow.com/questions/11374918
复制相似问题