IDbConnectionFactory
すべてのリクエスト間で共有する現在のデフォルトの代わりに、リクエストのスコープで再利用されるように変更します。また、カスタム接続文字列を使用してGetDatabaseConnectionFactory()
のインスタンスを IoC コンテナーに返す静的メソッド ( ) も作成しました。OrmLiteConnectionFactory
接続文字列を特定するために、パラメーターを読み取るだけの要求フィルターを使用しましたconnectionstring
。設定されていない場合は、デフォルト値が使用されます。この値はコレクションに設定され、メソッドRequestContext.Items
からアクセスできます。GetDatabaseConnectionFactory()
この方法で接続文字列を公開することは危険であることを忘れないでください。常に接続文字列の値を徹底的にチェックして、悪意のある値が含まれていないことを確認してください。つまり、管理データベースや別のサーバーに接続しようとしたり、デフォルト設定の上書きなどを変更したりしないようにしてください。
AppHost で:
ServiceStack V3:
public override void Configure(Container container)
{
container.Register<IDbConnectionFactory>(c => GetDatabaseConnectionFactory()).ReusedWithin(ReuseScope.Request);
RequestFilters.Add((req,res,obj) => {
// Default value
var defaultConnectionString = ConfigurationManager.ConnectionStrings["AppDb"].ConnectionString;
// Get the connection string from the connectionstring parameter, or use default
var dbConnectionString = req.GetParam("connectionstring") ?? defaultConnectionString;
// You should perform some checks here to make sure the connectionstring isn't something it shouldn't be
// ...
// Save the connection string to the HostContext.Instance.Items collection, so we can read it later
HostContext.Instance.Items.Add("ConnectionString", dbConnectionString);
});
}
public static IDbConnectionFactory GetDatabaseConnectionFactory()
{
// Read the connection string from our HostContext Items
var dbConnectionString = HostContext.Instance.Items["ConnectionString"];
if(dbConnectionString == null)
throw new Exception("Connection string has not been set");
// Return the connection factory for the given connection string
return new OrmLiteConnectionFactory(dbConnectionString, SqlServerOrmLiteDialectProvider.Instance) {
ConnectionFilter = x => new ProfiledDbConnection(x, Profiler.Current)
});
}
用途:
using System;
using Funq;
using ServiceStack.ServiceInterface;
using ServiceStack.ServiceHost;
using ServiceStack.WebHost.Endpoints;
using ServiceStack.OrmLite;
using ServiceStack.Common;
ServiceStack V4:
public override void Configure(Container container)
{
container.Register<IDbConnectionFactory>(c => GetDatabaseConnectionFactory()).ReusedWithin(ReuseScope.Request);
GlobalRequestFilters.Add((req,res,obj) => {
// Default value
var defaultConnectionString = ConfigurationManager.ConnectionStrings["AppDb"].ConnectionString;
// Get the connection string from the connectionstring parameter, or use default
var dbConnectionString = req.GetParam("connectionstring") ?? defaultConnectionString;
// You should perform some checks here to make sure the connectionstring isn't something it shouldn't be
// ...
// Save the connection string to the RequestContext.Items collection, so we can read it later
HostContext.RequestContext.Items.Add("ConnectionString", dbConnectionString);
});
}
public static IDbConnectionFactory GetDatabaseConnectionFactory()
{
// Read the connection string from our Items
var dbConnectionString = HostContext.RequestContext.Items["ConnectionString"];
if(dbConnectionString == null)
throw new Exception("Connection string has not been set");
// Return the connection factory for the given connection string
return new OrmLiteConnectionFactory(dbConnectionString, SqlServerOrmLiteDialectProvider.Instance) {
ConnectionFilter = x => new ProfiledDbConnection(x, Profiler.Current)
});
}
用途:
using System;
using Funq;
using ServiceStack;
using ServiceStack.Data;
using ServiceStack.OrmLite;
using ServiceStack.OrmLite.Sqlite;