Linq to sql StructureMap DBServiceRegistry和MVC mini profiler?

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

如果我在每个存储库类中使用此代码,那么就可以进行SQL分析,但我希望将这些代码从每个类移动到StructureMap处理DB的类中

存储库类的示例:

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();
    }
}