StructureMap DBServiceRegistry和MVC-mini-profiler?

Kev*_*nUK 10 structuremap linq-to-sql mvc-mini-profiler

如果我在每个Repository类中使用此代码,那么我可以使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();
    }
Run Code Online (Sandbox Code Playgroud)

现在我想将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());

    }
}
Run Code Online (Sandbox Code Playgroud)

这段代码不会导致任何错误,但我没有得到SQL分析,我做错了什么?

Sco*_*kay 1

注释是正确的,通过在 For 行之外创建 sql 连接,您将覆盖范围命令。

将所有内容封装到匿名委托中要好得多

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);
                });
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用单元测试来验证范围是否正确(测试语法为xunit.net)

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();
    }
}
Run Code Online (Sandbox Code Playgroud)