0

私は Asp.Net MVC と ServiceStack に取り組んでいます。servicestack ormlite を使用して SQL Server データベースに接続しようとしています。お気に入り

 var connectionString = ConfigurationManager.ConnectionStrings["AppDb"].ConnectionString;
 container.Register<IDbConnectionFactory>(
 new OrmLiteConnectionFactory(connectionString,
                    SqlServerOrmLiteDialectProvider.Instance)
                {
                    ConnectionFilter = x => new ProfiledDbConnection(x, Profiler.Current)
                });

データベースに接続できますが、私のシナリオでは接続文字列を動的に変更する必要があります。つまり、リクエスト本文からコンテンツを読み取り、接続文字列を準備する必要があります。servicestack では、AppHost クラスで SQL サーバー接続文字列を構成します。これは、アプリの開始時を意味します。しかし、コントローラーに接続文字列を設定する必要があります。セッションに配置して、そのセッションを ClassLibrary SeviceBase class で使用しようとしました。しかし、クラス ライブラリで asp.Net セッションを使用できません。サービス スタックで SQL Server 接続文字列を動的に変更する方法。だから私を導いてください。

4

1 に答える 1

3

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;
于 2014-03-29T10:01:13.187 に答える