使用StructureMap和IDbConnection的“按請求”方法 - 連接打開但在執行時關閉

dapper structuremap

嘗試使用StructureMap設置Dapper以使用“按請求”類型的方案。在我的Global.asax中,我有以下內容(從Ayende的舊帖子中修改了NHibernate,我發現在StructureMap中討論了BuildUp()方法):

protected static IDbConnection CreateConnection() { 
    var settings = ConfigurationManager.ConnectionStrings["MyConnectionString"];
    var connection = DbProviderFactories.GetFactory(settings.ProviderName).CreateConnection();
    if (connection == null) { 
        throw new ArgumentNullException("connection");
    }
    connection.ConnectionString = settings.ConnectionString;
    return connection;
}

public static IDbConnection CurrentConnection { 
    get { return (IDbConnection)HttpContext.Current.Items["current.connection"]; }
    set { HttpContext.Current.Items["current.connection"] = value; }
}

public Global() { 
    BeginRequest += (sender, args) => { 
        CurrentConnection = CreateConnection();
        CurrentConnection.Open(); 
    };

    EndRequest += (sender, args) => { 
        if (CurrentConnection == null) return;
        CurrentConnection.Close();
        CurrentConnection.Dispose();
    }
}

void Application_Start(object sender, EventArgs e) { 
    ObjectFactory.Initialize(x => { 
        x.For<IDbConnection>().Singleton().Use(CreateConnection());
        x.For<ICustomerRepository>().Use<CustomerRepository>();
        x.SetAllProperties(y => y.OfType<ICustomerRepository>());
    });
}

// BasePage.cs
public class BasePage : System.Web.UI.Page { 
    public IDbConnection CurrentConnection { get; set; }

    public BasePage() { 
        ObjectFactory.BuildUp(this);
    }
}

每次我嘗試調用它時,實際查詢失敗,並顯示一條錯誤,指出Connection的當前狀態已關閉,儘管BeginRequest處理程序上的斷點顯示正在連接上調用Open()。

如果我在每個存儲庫方法中的IDbConnection上手動調用Open和Close似乎有效,但我試圖避免在可能的情況下執行此操作。

一般承認的答案

您將連接創建為單例。這意味著只有一個連接對像用於整個應用程序頁面。您在Application_Start處理程序中新建的連接從不被頁面使用,因為它們將從容器獲取連接。

你最好使用這樣的東西:

void Application_Start(object sender, EventArgs e) { 
    ObjectFactory.Initialize(x => { 
        x.For<IDbConnection>().HttpContextScoped().Use(() => CreateConnection());
        ...
    }
}

 public Global() { 
    EndRequest += (sender, args) => { 
        ObjectFactory.GetInstance<IDbConnection>.Dispose();
    }
 }


許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因