Linq to sql StructureMap DBServiceRegistry和MVC mini profiler?
如果我在每个存储库类中使用此代码,那么就可以进行SQL分析,但我希望将这些代码从每个类移动到StructureMap处理DB的类中 存储库类的示例:Linq to sql StructureMap DBServiceRegistry和MVC mini profiler?,linq-to-sql,structuremap,mvc-mini-profiler,Linq To Sql,Structuremap,Mvc Mini Profiler,如果我在每个存储库类中使用此代码,那么就可以进行SQL分析,但我希望将这些代码从每个类移动到StructureMap处理DB的类中 存储库类的示例: public DB CreateNewContext() { var sqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["connection"].ConnectionString); var profiledCo
public DB CreateNewContext()
{
var sqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["connection"].ConnectionString);
var profiledConnection = ProfiledDbConnection.Get(sqlConnection);
return DataContextUtils.CreateDataContext<DB>(profiledConnection);
}
public SqlRecipeRepository(DB dataContext)
{
_db = CreateNewContext();
}
公共数据库CreateNewContext()
{
var sqlConnection=new sqlConnection(ConfigurationManager.ConnectionStrings[“connection”].ConnectionString);
var profiledConnection=ProfiledDbConnection.Get(sqlConnection);
返回DataContextTils.CreateDataContext(profiledConnection);
}
公共SqlRecipeRepository(DB dataContext)
{
_db=CreateNewContext();
}
现在,我希望dataContext变量是经过分析的版本,因此来自我的DBServiceRegistry类
以下是DBServiceRegistry类:
public class DBServiceRegistry : Registry
{
public DBServiceRegistry()
{
var sqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["GetMeCooking.Data.Properties.Settings.server"].ConnectionString);
var profiledConnection = ProfiledDbConnection.Get(sqlConnection);
For<DB>().HybridHttpOrThreadLocalScoped().Use(() => DataContextUtils.CreateDataContext<DB>(profiledConnection));
//Original method just had this:
//For<DB>().HybridHttpOrThreadLocalScoped().Use(() => new DB());
}
}
公共类DBServiceRegistry:注册表
{
公共数据库服务注册()
{
var sqlConnection=new sqlConnection(ConfigurationManager.ConnectionString[“GetMeCooking.Data.Properties.Settings.server”].ConnectionString);
var profiledConnection=ProfiledDbConnection.Get(sqlConnection);
For().HybridHttpOrthReadLocalScope().Use(()=>DataContextUtils.CreateDataContext(profiledConnection));
//最初的方法是这样的:
//For().HybridHttpOrthReadLocalScope().Use(()=>new DB());
}
}
此代码不会导致任何错误,但我没有得到SQL分析,我做错了什么?注释是正确的,通过使用For行创建SQL连接,您正在覆盖scope命令 更好的办法是将整个过程封装到一个匿名委托中
using System.Configuration;
using System.Data.SqlClient;
using System.Threading.Tasks;
using StructureMap;
using StructureMap.Configuration.DSL;
using Xunit;
public class DBServiceRegistry : Registry
{
private string connString = ConfigurationManager.ConnectionStrings["GetMeCooking.Data.Properties.Settings.server"].ConnectionString;
public DBServiceRegistry()
{
For<DB>().HybridHttpOrThreadLocalScoped().Use(
() =>
{
var sqlConnection = new SqlConnection(connString);
var profiledConnection = new StackExchange.Profiling.Data.ProfiledDbConnection(sqlConnection, MiniProfiler.Current);
return DataContextUtils.CreateDataContext<DB>(profiledConnection);
});
}
}
使用系统配置;
使用System.Data.SqlClient;
使用System.Threading.Tasks;
使用结构图;
使用StructureMap.Configuration.DSL;
使用Xunit;
公共类DBServiceRegistry:注册表
{
私有字符串connString=ConfigurationManager.ConnectionString[“GetMeCooking.Data.Properties.Settings.server”].ConnectionString;
公共数据库服务注册()
{
For().HybridHttpOrthReadLocalScope()。使用(
() =>
{
var sqlConnection=新的sqlConnection(connString);
var profiledConnection=new StackExchange.profileing.Data.ProfiledDbConnection(sqlConnection,MiniProfiler.Current);
返回DataContextTils.CreateDataContext(profiledConnection);
});
}
}
您可以使用单元测试来验证作用域是否正确(测试语法为xunit.net)
公共类DBRegistryTests:IDisposable
{
私人货柜;
公共数据库注册表测试()
{
//安排(或测试设置)
container=newcontainer(newdbservicegistry());
}
[事实]
public void ConnectionsAreSameInThread()
{
//在同一线程上创建两个连接
var conn1=container.GetInstance();
var conn2=container.GetInstance();
//断言应该相等,因为混合线程是作用域
//测试在同一个线程上执行
断言相等(conn1,conn2);
//连接已分析的其他断言
}
[事实]
public void connectionarentsameindifferentitthreads()
{
var conn1=container.GetInstance();
//从其他线程请求第二个连接
//(对于this.container.GetInstance());
conn2.Start();
(2)等等;
//断言来自两个不同线程的请求
//不一样
Assert.NotEqual(conn1,conn2.Result);
}
公共空间处置()
{
//测试拆卸
container.Dispose();
}
}
我真的不知道为什么分析部分不工作,但我发现代码有一个严重的问题。您正在注册表中创建一个将用于所有DBContext的连接实例。您在哪里分配LINQ to SQL连接的.Log
参数?另外,您是否在任何地方执行ObjectFactory.GetInstance()
?
public class DBRegistryTests : IDisposable
{
private Container container;
public DBRegistryTests()
{
// Arrange (or test setup)
container = new Container(new DBServiceRegistry());
}
[Fact]
public void ConnectionsAreSameInThread()
{
// Create two connections on same thread
var conn1 = container.GetInstance<DB>();
var conn2 = container.GetInstance<DB>();
// Assert should be equal because hybrid thread is scope
// and test executes on same thread
Assert.Equal(conn1, conn2);
// Other assertions that connection is profiled
}
[Fact]
public void ConnectionAreNotSameInDifferentThreads()
{
var conn1 = container.GetInstance<DB>();
// Request second connection from a different thread
// (for < c# 4.0 use Thread instead of task)
var conn2 = new Task<DB>(() => this.container.GetInstance<DB>());
conn2.Start();
conn2.Wait();
// Assert that request from two different threads
// are not the same
Assert.NotEqual(conn1, conn2.Result);
}
public void Dispose()
{
// Test teardown
container.Dispose();
}
}