更新 2:
恐怕在 AOP 方面看起来不太好 - 请参阅Is is possible to intercept a static method on an object you don't own and didn't create?
正如评论中提到的那样,最好的选择是使用提供者工具包的提供者实现并将你的钩子连接到SqlConnectionHelper.GetConnection()
我使用工具包代码,我已经大量清理,可靠多年,没有任何问题。让我在 4.0 上确认一下,如果您有兴趣,请打包。
更新:
好的,我想我更了解您的需求,请告诉我我是否正确:
您需要提供商正在使用的实际连接吗?
SqlMembershipProvider 使用一个辅助类 ,System.Web.DataAccess.SqlConnectionHolder
来访问它的所有数据。
我没有这样做,但根据我收集到的信息,您可以拦截调用以使用 AOP 实现(例如 Castle DynamicProxy(或利用它的库之一)构建此对象)并在那里建立连接。
有更多经验的人可以证实或否认这一点吗?
原答案:
无需从 SqlMembershipProvider 派生。只要进去,得到你需要的东西。
string connectionString =
typeof(SqlMembershipProvider)
.GetField("_sqlConnectionString",BindingFlags.NonPublic | BindingFlags.Instance)
.GetValue(Membership.Provider);